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 before=$(git hash-object file) &&
582 before=$(git rev-parse --short $before) &&
583 for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >>file &&
584 after=$(git hash-object file) &&
585 after=$(git rev-parse --short $after) &&
586 git update-index file &&
587 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." &&
588 git format-patch -o patches/ master..side &&
589 ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch
592 test_expect_success
'failure to write cover-letter aborts gracefully' '
593 test_when_finished "rmdir 0000-cover-letter.patch" &&
594 mkdir 0000-cover-letter.patch &&
595 test_must_fail git format-patch --no-renames --cover-letter -1
598 test_expect_success
'cover-letter inherits diff options' '
601 git format-patch --no-renames --cover-letter -1 &&
602 check_patch 0000-cover-letter.patch &&
603 ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch &&
604 git format-patch --cover-letter -1 -M &&
605 grep "file => foo .* 0 *\$" 0000-cover-letter.patch
610 This is an excessively long subject line for a message due to the
611 habit some projects have of not having a short, one-line subject at
612 the start of the commit message, but rather sticking a whole
613 paragraph right at the start as the only thing in the commit
614 message. It had better not become the filename for the patch.
619 test_expect_success
'shortlog of cover-letter wraps overly-long onelines' '
621 git format-patch --cover-letter -2 &&
622 sed -e "1,/A U Thor/d" -e "/^\$/q" < 0000-cover-letter.patch > output &&
623 test_cmp expect output
628 index $before..$after 100644
639 test_expect_success
'format-patch respects -U' '
641 git format-patch -U4 -2 &&
642 sed -e "1,/^diff/d" -e "/^+5/q" \
643 <0001-This-is-an-excessively-long-subject-line-for-a-messa.patch \
645 test_cmp expect output
651 diff --git a/file b/file
652 index $before..$after 100644
662 test_expect_success
'format-patch -p suppresses stat' '
664 git format-patch -p -2 &&
665 sed -e "1,/^\$/d" -e "/^+5/q" < 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch > output &&
666 test_cmp expect output
670 test_expect_success
'format-patch from a subdirectory (1)' '
681 echo "Oops? $filename"
688 test_expect_success
'format-patch from a subdirectory (2)' '
693 git format-patch -1 -o ..
699 echo "Oops? $filename"
703 basename=$(expr "$filename" : ".*/\(.*\)") &&
704 test -f "sub/$basename"
707 test_expect_success
'format-patch from a subdirectory (3)' '
713 git format-patch -1 -o "$TRASH_DIRECTORY"
715 basename=$(expr "$filename" : ".*/\(.*\)") &&
719 test_expect_success
'format-patch --in-reply-to' '
720 git format-patch -1 --stdout --in-reply-to "baz@foo.bar" > patch8 &&
721 grep "^In-Reply-To: <baz@foo.bar>" patch8 &&
722 grep "^References: <baz@foo.bar>" patch8
725 test_expect_success
'format-patch --signoff' '
726 git format-patch -1 --signoff --stdout >out &&
727 grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out
730 test_expect_success
'format-patch --notes --signoff' '
731 git notes --ref test add -m "test message" HEAD &&
732 git format-patch -1 --signoff --stdout --notes=test >out &&
733 # Three dashes must come after S-o-b
734 ! sed "/^Signed-off-by: /q" out | grep "test message" &&
735 sed "1,/^Signed-off-by: /d" out | grep "test message" &&
736 # Notes message must come after three dashes
737 ! sed "/^---$/q" out | grep "test message" &&
738 sed "1,/^---$/d" out | grep "test message"
741 test_expect_success
'format-patch notes output control' '
742 git notes add -m "notes config message" HEAD &&
743 test_when_finished git notes remove HEAD &&
745 git format-patch -1 --stdout >out &&
746 ! grep "notes config message" out &&
747 git format-patch -1 --stdout --notes >out &&
748 grep "notes config message" out &&
749 git format-patch -1 --stdout --no-notes >out &&
750 ! grep "notes config message" out &&
751 git format-patch -1 --stdout --notes --no-notes >out &&
752 ! grep "notes config message" out &&
753 git format-patch -1 --stdout --no-notes --notes >out &&
754 grep "notes config message" out &&
756 test_config format.notes true &&
757 git format-patch -1 --stdout >out &&
758 grep "notes config message" out &&
759 git format-patch -1 --stdout --notes >out &&
760 grep "notes config message" out &&
761 git format-patch -1 --stdout --no-notes >out &&
762 ! grep "notes config message" out &&
763 git format-patch -1 --stdout --notes --no-notes >out &&
764 ! grep "notes config message" out &&
765 git format-patch -1 --stdout --no-notes --notes >out &&
766 grep "notes config message" out
769 test_expect_success
'format-patch with multiple notes refs' '
770 git notes --ref note1 add -m "this is note 1" HEAD &&
771 test_when_finished git notes --ref note1 remove HEAD &&
772 git notes --ref note2 add -m "this is note 2" HEAD &&
773 test_when_finished git notes --ref note2 remove HEAD &&
775 git format-patch -1 --stdout >out &&
776 ! grep "this is note 1" out &&
777 ! grep "this is note 2" out &&
778 git format-patch -1 --stdout --notes=note1 >out &&
779 grep "this is note 1" out &&
780 ! grep "this is note 2" out &&
781 git format-patch -1 --stdout --notes=note2 >out &&
782 ! grep "this is note 1" out &&
783 grep "this is note 2" out &&
784 git format-patch -1 --stdout --notes=note1 --notes=note2 >out &&
785 grep "this is note 1" out &&
786 grep "this is note 2" out &&
788 test_config format.notes note1 &&
789 git format-patch -1 --stdout >out &&
790 grep "this is note 1" out &&
791 ! grep "this is note 2" out &&
792 git format-patch -1 --stdout --no-notes >out &&
793 ! grep "this is note 1" out &&
794 ! grep "this is note 2" out &&
795 git format-patch -1 --stdout --notes=note2 >out &&
796 grep "this is note 1" out &&
797 grep "this is note 2" out &&
798 git format-patch -1 --stdout --no-notes --notes=note2 >out &&
799 ! grep "this is note 1" out &&
800 grep "this is note 2" out &&
802 git config --add format.notes note2 &&
803 git format-patch -1 --stdout >out &&
804 grep "this is note 1" out &&
805 grep "this is note 2" out &&
806 git format-patch -1 --stdout --no-notes >out &&
807 ! grep "this is note 1" out &&
808 ! grep "this is note 2" out
811 echo "fatal: --name-only does not make sense" > expect.name-only
812 echo "fatal: --name-status does not make sense" > expect.name-status
813 echo "fatal: --check does not make sense" > expect.check
815 test_expect_success
'options no longer allowed for format-patch' '
816 test_must_fail git format-patch --name-only 2> output &&
817 test_i18ncmp expect.name-only output &&
818 test_must_fail git format-patch --name-status 2> output &&
819 test_i18ncmp expect.name-status output &&
820 test_must_fail git format-patch --check 2> output &&
821 test_i18ncmp expect.check output'
823 test_expect_success
'format-patch --numstat should produce a patch' '
824 git format-patch --numstat --stdout master..side > output &&
825 test 5 = $(grep "^diff --git a/" output | wc -l)'
827 test_expect_success
'format-patch -- <path>' '
828 git format-patch master..side -- file 2>error &&
829 ! grep "Use .--" error
832 test_expect_success
'format-patch --ignore-if-in-upstream HEAD' '
833 git format-patch --ignore-if-in-upstream HEAD
836 git_version
="$(git --version | sed "s
/.
* //")"
839 printf "%s\n%s\n\n" "-- " "${1:-$git_version}"
842 test_expect_success
'format-patch default signature' '
843 git format-patch --stdout -1 | tail -n 3 >output &&
845 test_cmp expect output
848 test_expect_success
'format-patch --signature' '
849 git format-patch --stdout --signature="my sig" -1 | tail -n 3 >output &&
850 signature "my sig" >expect &&
851 test_cmp expect output
854 test_expect_success
'format-patch with format.signature config' '
855 git config format.signature "config sig" &&
856 git format-patch --stdout -1 >output &&
857 grep "config sig" output
860 test_expect_success
'format-patch --signature overrides format.signature' '
861 git config format.signature "config sig" &&
862 git format-patch --stdout --signature="overrides" -1 >output &&
863 ! grep "config sig" output &&
864 grep "overrides" output
867 test_expect_success
'format-patch --no-signature ignores format.signature' '
868 git config format.signature "config sig" &&
869 git format-patch --stdout --signature="my sig" --no-signature \
871 check_patch output &&
872 ! grep "config sig" output &&
873 ! grep "my sig" output &&
874 ! grep "^-- \$" output
877 test_expect_success
'format-patch --signature --cover-letter' '
878 git config --unset-all format.signature &&
879 git format-patch --stdout --signature="my sig" --cover-letter \
881 grep "my sig" output &&
882 test 2 = $(grep "my sig" output | wc -l)
885 test_expect_success
'format.signature="" suppresses signatures' '
886 git config format.signature "" &&
887 git format-patch --stdout -1 >output &&
888 check_patch output &&
889 ! grep "^-- \$" output
892 test_expect_success
'format-patch --no-signature suppresses signatures' '
893 git config --unset-all format.signature &&
894 git format-patch --stdout --no-signature -1 >output &&
895 check_patch output &&
896 ! grep "^-- \$" output
899 test_expect_success
'format-patch --signature="" suppresses signatures' '
900 git format-patch --stdout --signature="" -1 >output &&
901 check_patch output &&
902 ! grep "^-- \$" output
905 test_expect_success
'prepare mail-signature input' '
906 cat >mail-signature <<-\EOF
908 Test User <test.email@kernel.org>
909 http://git.kernel.org/cgit/git/git.git
911 git.kernel.org/?p=git/git.git;a=summary
916 test_expect_success
'--signature-file=file works' '
917 git format-patch --stdout --signature-file=mail-signature -1 >output &&
918 check_patch output &&
919 sed -e "1,/^-- \$/d" <output >actual &&
921 cat mail-signature && echo
923 test_cmp expect actual
926 test_expect_success
'format.signaturefile works' '
927 test_config format.signaturefile mail-signature &&
928 git format-patch --stdout -1 >output &&
929 check_patch output &&
930 sed -e "1,/^-- \$/d" <output >actual &&
932 cat mail-signature && echo
934 test_cmp expect actual
937 test_expect_success
'--no-signature suppresses format.signaturefile ' '
938 test_config format.signaturefile mail-signature &&
939 git format-patch --stdout --no-signature -1 >output &&
940 check_patch output &&
941 ! grep "^-- \$" output
944 test_expect_success
'--signature-file overrides format.signaturefile' '
945 cat >other-mail-signature <<-\EOF &&
946 Use this other signature instead of mail-signature.
948 test_config format.signaturefile mail-signature &&
949 git format-patch --stdout \
950 --signature-file=other-mail-signature -1 >output &&
951 check_patch output &&
952 sed -e "1,/^-- \$/d" <output >actual &&
954 cat other-mail-signature && echo
956 test_cmp expect actual
959 test_expect_success
'--signature overrides format.signaturefile' '
960 test_config format.signaturefile mail-signature &&
961 git format-patch --stdout --signature="my sig" -1 >output &&
962 check_patch output &&
966 test_expect_success TTY
'format-patch --stdout paginates' '
968 test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all &&
969 test_path_is_file pager_used
972 test_expect_success TTY
'format-patch --stdout pagination can be disabled' '
974 test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all &&
975 test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all &&
976 test_path_is_missing pager_used &&
977 test_path_is_missing .git/pager_used
980 test_expect_success
'format-patch handles multi-line subjects' '
982 echo content >>file &&
983 for i in one two three; do echo $i; done >msg &&
986 git format-patch -o patches -1 &&
987 grep ^Subject: patches/0001-one.patch >actual &&
988 echo "Subject: [PATCH] one two three" >expect &&
989 test_cmp expect actual
992 test_expect_success
'format-patch handles multi-line encoded subjects' '
994 echo content >>file &&
995 for i in en två tre; do echo $i; done >msg &&
998 git format-patch -o patches -1 &&
999 grep ^Subject: patches/0001-en.patch >actual &&
1000 echo "Subject: [PATCH] =?UTF-8?q?en=20tv=C3=A5=20tre?=" >expect &&
1001 test_cmp expect actual
1005 M64
=$M8$M8$M8$M8$M8$M8$M8$M8
1006 M512
=$M64$M64$M64$M64$M64$M64$M64$M64
1008 Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
1009 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1010 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
1011 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1012 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
1013 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1014 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1016 test_expect_success
'format-patch wraps extremely long subject (ascii)' '
1017 echo content >>file &&
1019 git commit -m "$M512" &&
1020 git format-patch --stdout -1 >patch &&
1021 sed -n "/^Subject/p; /^ /p; /^$/q" <patch >subject &&
1022 test_cmp expect subject
1026 M64
=$M8$M8$M8$M8$M8$M8$M8$M8
1027 M512
=$M64$M64$M64$M64$M64$M64$M64$M64
1029 Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1030 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1031 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1032 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
1033 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1034 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1035 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1036 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1037 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
1038 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1039 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1040 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1041 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1042 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
1043 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1044 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1045 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1046 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1047 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
1048 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1049 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1050 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1051 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1054 test_expect_success
'format-patch wraps extremely long subject (rfc2047)' '
1056 echo content >>file &&
1058 git commit -m "$M512" &&
1059 git format-patch --stdout -1 >patch &&
1060 sed -n "/^Subject/p; /^ /p; /^$/q" <patch >subject &&
1061 test_cmp expect subject
1065 echo content
>>file &&
1067 GIT_AUTHOR_NAME
=$1 git commit
-m author-check
&&
1068 git format-patch
--stdout
-1 >patch &&
1069 sed -n
"/^From: /p; /^ /p; /^$/q" <patch >actual
&&
1070 test_cmp expect actual
1074 From: "Foo B. Bar" <author@example.com>
1076 test_expect_success
'format-patch quotes dot in from-headers' '
1077 check_author "Foo B. Bar"
1081 From: "Foo \"The Baz\" Bar" <author@example.com>
1083 test_expect_success
'format-patch quotes double-quote in from-headers' '
1084 check_author "Foo \"The Baz\" Bar"
1088 From: =?UTF-8?q?F=C3=B6o=20Bar?= <author@example.com>
1090 test_expect_success
'format-patch uses rfc2047-encoded from-headers when necessary' '
1091 check_author "Föo Bar"
1095 From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= <author@example.com>
1097 test_expect_success
'rfc2047-encoded from-headers leave no rfc822 specials' '
1098 check_author "Föo B. Bar"
1102 From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_
1103 <author@example.com>
1105 test_expect_success
'format-patch wraps moderately long from-header (ascii)' '
1106 check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_"
1110 From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1111 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1112 Bar Foo Bar Foo Bar Foo Bar <author@example.com>
1114 test_expect_success
'format-patch wraps extremely long from-header (ascii)' '
1115 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"
1119 From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1120 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1121 Bar Foo Bar Foo Bar Foo Bar" <author@example.com>
1123 test_expect_success
'format-patch wraps extremely long from-header (rfc822)' '
1124 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"
1128 From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?=
1129 =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?=
1130 =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?=
1131 =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?=
1132 =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= <author@example.com>
1134 test_expect_success
'format-patch wraps extremely long from-header (rfc2047)' '
1135 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"
1139 Subject: header with . in it
1141 test_expect_success
'subject lines do not have 822 atom-quoting' '
1142 echo content >>file &&
1144 git commit -m "header with . in it" &&
1145 git format-patch -k -1 --stdout >patch &&
1146 grep ^Subject: patch >actual &&
1147 test_cmp expect actual
1151 Subject: [PREFIX 1/1] header with . in it
1153 test_expect_success
'subject prefixes have space prepended' '
1154 git format-patch -n -1 --stdout --subject-prefix=PREFIX >patch &&
1155 grep ^Subject: patch >actual &&
1156 test_cmp expect actual
1160 Subject: [1/1] header with . in it
1162 test_expect_success
'empty subject prefix does not have extra space' '
1163 git format-patch -n -1 --stdout --subject-prefix= >patch &&
1164 grep ^Subject: patch >actual &&
1165 test_cmp expect actual
1168 test_expect_success
'--rfc' '
1169 cat >expect <<-\EOF &&
1170 Subject: [RFC PATCH 1/1] header with . in it
1172 git format-patch -n -1 --stdout --rfc >patch &&
1173 grep ^Subject: patch >actual &&
1174 test_cmp expect actual
1177 test_expect_success
'--from=ident notices bogus ident' '
1178 test_must_fail git format-patch -1 --stdout --from=foo >patch
1181 test_expect_success
'--from=ident replaces author' '
1182 git format-patch -1 --stdout --from="Me <me@example.com>" >patch &&
1183 cat >expect <<-\EOF &&
1184 From: Me <me@example.com>
1186 From: A U Thor <author@example.com>
1189 sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >patch.head &&
1190 test_cmp expect patch.head
1193 test_expect_success
'--from uses committer ident' '
1194 git format-patch -1 --stdout --from >patch &&
1195 cat >expect <<-\EOF &&
1196 From: C O Mitter <committer@example.com>
1198 From: A U Thor <author@example.com>
1201 sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >patch.head &&
1202 test_cmp expect patch.head
1205 test_expect_success
'--from omits redundant in-body header' '
1206 git format-patch -1 --stdout --from="A U Thor <author@example.com>" >patch &&
1207 cat >expect <<-\EOF &&
1208 From: A U Thor <author@example.com>
1211 sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >patch.head &&
1212 test_cmp expect patch.head
1215 test_expect_success
'in-body headers trigger content encoding' '
1216 test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
1217 test_when_finished "git reset --hard HEAD^" &&
1218 git format-patch -1 --stdout --from >patch &&
1219 cat >expect <<-\EOF &&
1220 From: C O Mitter <committer@example.com>
1221 Content-Type: text/plain; charset=UTF-8
1223 From: éxötìc <author@example.com>
1226 sed -ne "/^From:/p; /^$/p; /^Content-Type/p; /^---$/q" <patch >patch.head &&
1227 test_cmp expect patch.head
1232 C
=$
(git commit-tree HEAD^^
{tree
} -p HEAD
) &&
1233 git format-patch
--stdout
--signoff
$C^..
$C >append_signoff.
patch &&
1234 sed -n
-e
"1,/^---$/p" append_signoff.
patch |
1235 egrep -n
"^Subject|Sign|^$"
1238 test_expect_success
'signoff: commit with no body' '
1239 append_signoff </dev/null >actual &&
1240 cat <<\EOF | sed "s/EOL$//" >expected &&
1241 4:Subject: [PATCH] EOL
1243 9:Signed-off-by: C O Mitter <committer@example.com>
1245 test_cmp expected actual
1248 test_expect_success
'signoff: commit with only subject' '
1249 echo subject | append_signoff >actual &&
1250 cat >expected <<\EOF &&
1251 4:Subject: [PATCH] subject
1253 9:Signed-off-by: C O Mitter <committer@example.com>
1255 test_cmp expected actual
1258 test_expect_success
'signoff: commit with only subject that does not end with NL' '
1259 printf subject | append_signoff >actual &&
1260 cat >expected <<\EOF &&
1261 4:Subject: [PATCH] subject
1263 9:Signed-off-by: C O Mitter <committer@example.com>
1265 test_cmp expected actual
1268 test_expect_success
'signoff: no existing signoffs' '
1269 append_signoff <<\EOF >actual &&
1274 cat >expected <<\EOF &&
1275 4:Subject: [PATCH] subject
1278 11:Signed-off-by: C O Mitter <committer@example.com>
1280 test_cmp expected actual
1283 test_expect_success
'signoff: no existing signoffs and no trailing NL' '
1284 printf "subject\n\nbody" | append_signoff >actual &&
1285 cat >expected <<\EOF &&
1286 4:Subject: [PATCH] subject
1289 11:Signed-off-by: C O Mitter <committer@example.com>
1291 test_cmp expected actual
1294 test_expect_success
'signoff: some random signoff' '
1295 append_signoff <<\EOF >actual &&
1300 Signed-off-by: my@house
1302 cat >expected <<\EOF &&
1303 4:Subject: [PATCH] subject
1306 11:Signed-off-by: my@house
1307 12:Signed-off-by: C O Mitter <committer@example.com>
1309 test_cmp expected actual
1312 test_expect_success
'signoff: misc conforming footer elements' '
1313 append_signoff <<\EOF >actual &&
1318 Signed-off-by: my@house
1319 (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709)
1320 Tested-by: Some One <someone@example.com>
1323 cat >expected <<\EOF &&
1324 4:Subject: [PATCH] subject
1327 11:Signed-off-by: my@house
1328 15:Signed-off-by: C O Mitter <committer@example.com>
1330 test_cmp expected actual
1333 test_expect_success
'signoff: some random signoff-alike' '
1334 append_signoff <<\EOF >actual &&
1338 Fooled-by-me: my@house
1340 cat >expected <<\EOF &&
1341 4:Subject: [PATCH] subject
1344 12:Signed-off-by: C O Mitter <committer@example.com>
1346 test_cmp expected actual
1349 test_expect_success
'signoff: not really a signoff' '
1350 append_signoff <<\EOF >actual &&
1353 I want to mention about Signed-off-by: here.
1355 cat >expected <<\EOF &&
1356 4:Subject: [PATCH] subject
1358 9:I want to mention about Signed-off-by: here.
1360 11:Signed-off-by: C O Mitter <committer@example.com>
1362 test_cmp expected actual
1365 test_expect_success
'signoff: not really a signoff (2)' '
1366 append_signoff <<\EOF >actual &&
1370 Signed-off-by: example happens to be wrapped here.
1372 cat >expected <<\EOF &&
1373 4:Subject: [PATCH] subject
1375 10:Signed-off-by: example happens to be wrapped here.
1376 11:Signed-off-by: C O Mitter <committer@example.com>
1378 test_cmp expected actual
1381 test_expect_success
'signoff: valid S-o-b paragraph in the middle' '
1382 append_signoff <<\EOF >actual &&
1385 Signed-off-by: my@house
1386 Signed-off-by: your@house
1390 cat >expected <<\EOF &&
1391 4:Subject: [PATCH] subject
1393 9:Signed-off-by: my@house
1394 10:Signed-off-by: your@house
1397 14:Signed-off-by: C O Mitter <committer@example.com>
1399 test_cmp expected actual
1402 test_expect_success
'signoff: the same signoff at the end' '
1403 append_signoff <<\EOF >actual &&
1408 Signed-off-by: C O Mitter <committer@example.com>
1410 cat >expected <<\EOF &&
1411 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: the same signoff at the end, no trailing NL' '
1420 printf "subject\n\nSigned-off-by: C O Mitter <committer@example.com>" |
1421 append_signoff >actual &&
1422 cat >expected <<\EOF &&
1423 4:Subject: [PATCH] subject
1425 9:Signed-off-by: C O Mitter <committer@example.com>
1427 test_cmp expected actual
1430 test_expect_success
'signoff: the same signoff NOT at the end' '
1431 append_signoff <<\EOF >actual &&
1436 Signed-off-by: C O Mitter <committer@example.com>
1437 Signed-off-by: my@house
1439 cat >expected <<\EOF &&
1440 4:Subject: [PATCH] subject
1443 11:Signed-off-by: C O Mitter <committer@example.com>
1444 12:Signed-off-by: my@house
1446 test_cmp expected actual
1449 test_expect_success
'signoff: tolerate garbage in conforming footer' '
1450 append_signoff <<\EOF >actual &&
1457 Signed-off-by: C O Mitter <committer@example.com>
1459 cat >expected <<\EOF &&
1460 4:Subject: [PATCH] subject
1463 13:Signed-off-by: C O Mitter <committer@example.com>
1465 test_cmp expected actual
1468 test_expect_success
'signoff: respect trailer config' '
1469 append_signoff <<\EOF >actual &&
1475 cat >expected <<\EOF &&
1476 4:Subject: [PATCH] subject
1479 12:Signed-off-by: C O Mitter <committer@example.com>
1481 test_cmp expected actual &&
1483 test_config trailer.Myfooter.ifexists add &&
1484 append_signoff <<\EOF >actual &&
1490 cat >expected <<\EOF &&
1491 4:Subject: [PATCH] subject
1493 11:Signed-off-by: C O Mitter <committer@example.com>
1495 test_cmp expected actual
1498 test_expect_success
'signoff: footer begins with non-signoff without @ sign' '
1499 append_signoff <<\EOF >actual &&
1506 Change-id: Ideadbeef
1507 Signed-off-by: C O Mitter <committer@example.com>
1510 cat >expected <<\EOF &&
1511 4:Subject: [PATCH] subject
1514 14:Signed-off-by: C O Mitter <committer@example.com>
1516 test_cmp expected actual
1519 test_expect_success
'format patch ignores color.ui' '
1520 test_unconfig color.ui &&
1521 git format-patch --stdout -1 >expect &&
1522 test_config color.ui always &&
1523 git format-patch --stdout -1 >actual &&
1524 test_cmp expect actual
1527 test_expect_success
'cover letter using branch description (1)' '
1528 git checkout rebuild-1 &&
1529 test_config branch.rebuild-1.description hello &&
1530 git format-patch --stdout --cover-letter master >actual &&
1531 grep hello actual >/dev/null
1534 test_expect_success
'cover letter using branch description (2)' '
1535 git checkout rebuild-1 &&
1536 test_config branch.rebuild-1.description hello &&
1537 git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual &&
1538 grep hello actual >/dev/null
1541 test_expect_success
'cover letter using branch description (3)' '
1542 git checkout rebuild-1 &&
1543 test_config branch.rebuild-1.description hello &&
1544 git format-patch --stdout --cover-letter ^master rebuild-1 >actual &&
1545 grep hello actual >/dev/null
1548 test_expect_success
'cover letter using branch description (4)' '
1549 git checkout rebuild-1 &&
1550 test_config branch.rebuild-1.description hello &&
1551 git format-patch --stdout --cover-letter master.. >actual &&
1552 grep hello actual >/dev/null
1555 test_expect_success
'cover letter using branch description (5)' '
1556 git checkout rebuild-1 &&
1557 test_config branch.rebuild-1.description hello &&
1558 git format-patch --stdout --cover-letter -2 HEAD >actual &&
1559 grep hello actual >/dev/null
1562 test_expect_success
'cover letter using branch description (6)' '
1563 git checkout rebuild-1 &&
1564 test_config branch.rebuild-1.description hello &&
1565 git format-patch --stdout --cover-letter -2 >actual &&
1566 grep hello actual >/dev/null
1569 test_expect_success
'cover letter with nothing' '
1570 git format-patch --stdout --cover-letter >actual &&
1571 test_line_count = 0 actual
1574 test_expect_success
'cover letter auto' '
1576 test_when_finished "rm -rf tmp;
1577 git config --unset format.coverletter" &&
1579 git config format.coverletter auto &&
1580 git format-patch -o tmp -1 >list &&
1581 test_line_count = 1 list &&
1582 git format-patch -o tmp -2 >list &&
1583 test_line_count = 3 list
1586 test_expect_success
'cover letter auto user override' '
1588 test_when_finished "rm -rf tmp;
1589 git config --unset format.coverletter" &&
1591 git config format.coverletter auto &&
1592 git format-patch -o tmp --cover-letter -1 >list &&
1593 test_line_count = 2 list &&
1594 git format-patch -o tmp --cover-letter -2 >list &&
1595 test_line_count = 3 list &&
1596 git format-patch -o tmp --no-cover-letter -1 >list &&
1597 test_line_count = 1 list &&
1598 git format-patch -o tmp --no-cover-letter -2 >list &&
1599 test_line_count = 2 list
1602 test_expect_success
'format-patch --zero-commit' '
1603 git format-patch --zero-commit --stdout v2..v1 >patch2 &&
1604 grep "^From " patch2 | sort | uniq >actual &&
1605 echo "From $ZERO_OID Mon Sep 17 00:00:00 2001" >expect &&
1606 test_cmp expect actual
1609 test_expect_success
'From line has expected format' '
1610 git format-patch --stdout v2..v1 >patch2 &&
1611 grep "^From " patch2 >from &&
1612 grep "^From $OID_REGEX Mon Sep 17 00:00:00 2001$" patch2 >filtered &&
1613 test_cmp from filtered
1616 test_expect_success
'format-patch format.outputDirectory option' '
1617 test_config format.outputDirectory patches &&
1619 git format-patch master..side &&
1620 test $(git rev-list master..side | wc -l) -eq $(ls patches | wc -l)
1623 test_expect_success
'format-patch -o overrides format.outputDirectory' '
1624 test_config format.outputDirectory patches &&
1625 rm -fr patches patchset &&
1626 git format-patch master..side -o patchset &&
1627 test_path_is_missing patches &&
1628 test_path_is_dir patchset
1631 test_expect_success
'format-patch --base' '
1632 git checkout side &&
1633 git format-patch --stdout --base=HEAD~3 -1 | tail -n 7 >actual1 &&
1634 git format-patch --stdout --base=HEAD~3 HEAD~.. | tail -n 7 >actual2 &&
1636 echo "base-commit: $(git rev-parse HEAD~3)" >>expected &&
1637 echo "prerequisite-patch-id: $(git show --patch HEAD~2 | git patch-id --stable | awk "{print \$1}")" >>expected &&
1638 echo "prerequisite-patch-id: $(git show --patch HEAD~1 | git patch-id --stable | awk "{print \$1}")" >>expected &&
1639 signature >> expected &&
1640 test_cmp expected actual1 &&
1641 test_cmp expected actual2
1644 test_expect_success
'format-patch --base errors out when base commit is in revision list' '
1645 test_must_fail git format-patch --base=HEAD -2 &&
1646 test_must_fail git format-patch --base=HEAD~1 -2 &&
1647 git format-patch --stdout --base=HEAD~2 -2 >patch &&
1648 grep "^base-commit:" patch >actual &&
1649 echo "base-commit: $(git rev-parse HEAD~2)" >expected &&
1650 test_cmp expected actual
1653 test_expect_success
'format-patch --base errors out when base commit is not ancestor of revision list' '
1654 # For history as below:
1656 # ---Q---P---Z---Y---*---X
1660 # If "format-patch Z..X" is given, P and Z can not be specified as the base commit
1661 git checkout -b topic1 master &&
1662 git rev-parse HEAD >commit-id-base &&
1664 git rev-parse HEAD >commit-id-P &&
1666 git rev-parse HEAD >commit-id-Z &&
1668 git checkout -b topic2 master &&
1672 test_must_fail git format-patch --base=$(cat commit-id-P) -3 &&
1673 test_must_fail git format-patch --base=$(cat commit-id-Z) -3 &&
1674 git format-patch --stdout --base=$(cat commit-id-base) -3 >patch &&
1675 grep "^base-commit:" patch >actual &&
1676 echo "base-commit: $(cat commit-id-base)" >expected &&
1677 test_cmp expected actual
1680 test_expect_success
'format-patch --base=auto' '
1681 git checkout -b upstream master &&
1682 git checkout -b local upstream &&
1683 git branch --set-upstream-to=upstream &&
1686 git format-patch --stdout --base=auto -2 >patch &&
1687 grep "^base-commit:" patch >actual &&
1688 echo "base-commit: $(git rev-parse upstream)" >expected &&
1689 test_cmp expected actual
1692 test_expect_success
'format-patch errors out when history involves criss-cross' '
1693 # setup criss-cross history
1701 git checkout master &&
1703 git checkout -b xb master &&
1705 git checkout -b xc master &&
1707 git checkout -b xbc xb -- &&
1709 git checkout -b xcb xc -- &&
1710 git branch --set-upstream-to=xbc &&
1716 test_must_fail git format-patch --base=auto -1
1719 test_expect_success
'format-patch format.useAutoBaseoption' '
1720 test_when_finished "git config --unset format.useAutoBase" &&
1721 git checkout local &&
1722 git config format.useAutoBase true &&
1723 git format-patch --stdout -1 >patch &&
1724 grep "^base-commit:" patch >actual &&
1725 echo "base-commit: $(git rev-parse upstream)" >expected &&
1726 test_cmp expected actual
1729 test_expect_success
'format-patch --base overrides format.useAutoBase' '
1730 test_when_finished "git config --unset format.useAutoBase" &&
1731 git config format.useAutoBase true &&
1732 git format-patch --stdout --base=HEAD~1 -1 >patch &&
1733 grep "^base-commit:" patch >actual &&
1734 echo "base-commit: $(git rev-parse HEAD~1)" >expected &&
1735 test_cmp expected actual
1738 test_expect_success
'format-patch --base with --attach' '
1739 git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch &&
1740 sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \
1742 test_write_lines 1 2 >expect &&
1743 test_cmp expect actual
1745 test_expect_success
'format-patch --attach cover-letter only is non-multipart' '
1746 test_when_finished "rm -fr patches" &&
1747 git format-patch -o patches --cover-letter --attach=mimemime --base=HEAD~ -1 &&
1748 ! egrep "^--+mimemime" patches/0000*.patch &&
1749 egrep "^--+mimemime$" patches/0001*.patch >output &&
1750 test_line_count = 2 output &&
1751 egrep "^--+mimemime--$" patches/0001*.patch >output &&
1752 test_line_count = 1 output
1755 test_expect_success
'format-patch --pretty=mboxrd' '
1757 cat >msg <<-INPUT_END &&
1758 mboxrd should escape the body
1760 From could trip up a loose mbox parser
1761 >From extra escape for reversibility
1762 >>From extra escape for reversibility 2
1763 from lower case not escaped
1764 Fromm bad speling not escaped
1765 From with leading space not escaped
1774 cat >expect <<-INPUT_END &&
1775 >From could trip up a loose mbox parser
1776 >>From extra escape for reversibility
1777 >>>From extra escape for reversibility 2
1778 from lower case not escaped
1779 Fromm bad speling not escaped
1780 From with leading space not escaped
1789 C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) &&
1790 git format-patch --pretty=mboxrd --stdout -1 $C~1..$C >patch &&
1791 git grep -h --no-index -A11 \
1792 "^>From could trip up a loose mbox parser" patch >actual &&
1793 test_cmp expect actual
1796 test_expect_success
'interdiff: setup' '
1797 git checkout -b boop master &&
1798 test_commit fnorp blorp &&
1799 test_commit fleep blorp
1802 test_expect_success
'interdiff: cover-letter' '
1803 sed "y/q/ /" >expect <<-\EOF &&
1807 git format-patch --cover-letter --interdiff=boop~2 -1 boop &&
1808 test_i18ngrep "^Interdiff:$" 0000-cover-letter.patch &&
1809 test_i18ngrep ! "^Interdiff:$" 0001-fleep.patch &&
1810 sed "1,/^@@ /d; /^-- $/q" <0000-cover-letter.patch >actual &&
1811 test_cmp expect actual
1814 test_expect_success
'interdiff: reroll-count' '
1815 git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop &&
1816 test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
1819 test_expect_success
'interdiff: solo-patch' '
1820 cat >expect <<-\EOF &&
1824 git format-patch --interdiff=boop~2 -1 boop &&
1825 test_i18ngrep "^Interdiff:$" 0001-fleep.patch &&
1826 sed "1,/^ @@ /d; /^$/q" <0001-fleep.patch >actual &&
1827 test_cmp expect actual