Git fork
at reftables-rust 2550 lines 76 kB view raw
1#!/bin/sh 2# 3# Copyright (c) 2006 Junio C Hamano 4# 5 6test_description='various format-patch tests' 7 8GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 9export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 10 11. ./test-lib.sh 12. "$TEST_DIRECTORY"/lib-terminal.sh 13 14test_expect_success setup ' 15 test_write_lines 1 2 3 4 5 6 7 8 9 10 >file && 16 cat file >elif && 17 git add file elif && 18 test_tick && 19 git commit -m Initial && 20 git checkout -b side && 21 22 test_write_lines 1 2 5 6 A B C 7 8 9 10 >file && 23 test_chmod +x elif && 24 test_tick && 25 git commit -m "Side changes #1" && 26 27 test_write_lines D E F >>file && 28 git update-index file && 29 test_tick && 30 git commit -m "Side changes #2" && 31 git tag C2 && 32 33 test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >file && 34 git update-index file && 35 test_tick && 36 git commit -m "Side changes #3 with \\n backslash-n in it." && 37 38 git checkout main && 39 git diff-tree -p C2 >patch && 40 git apply --index <patch && 41 test_tick && 42 git commit -m "Main accepts moral equivalent of #2" && 43 44 git checkout side && 45 git checkout -b patchid && 46 test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >file2 && 47 test_write_lines 1 2 3 A 4 B C 7 8 9 10 D E F 5 6 >file3 && 48 test_write_lines 8 9 10 >file && 49 git add file file2 file3 && 50 test_tick && 51 git commit -m "patchid 1" && 52 test_write_lines 4 A B 7 8 9 10 >file2 && 53 test_write_lines 8 9 10 5 6 >file3 && 54 git add file2 file3 && 55 test_tick && 56 git commit -m "patchid 2" && 57 test_write_lines 10 5 6 >file && 58 git add file && 59 test_tick && 60 git commit -m "patchid 3" && 61 62 git checkout -b empty main && 63 test_tick && 64 git commit --allow-empty -m "empty commit" && 65 66 git checkout main 67' 68 69test_expect_success 'format-patch --ignore-if-in-upstream' ' 70 git format-patch --stdout main..side >patch0 && 71 grep "^From " patch0 >from0 && 72 test_line_count = 3 from0 73' 74 75test_expect_success 'format-patch --ignore-if-in-upstream' ' 76 git format-patch --stdout \ 77 --ignore-if-in-upstream main..side >patch1 && 78 grep "^From " patch1 >from1 && 79 test_line_count = 2 from1 80' 81 82test_expect_success 'format-patch --ignore-if-in-upstream handles tags' ' 83 git tag -a v1 -m tag side && 84 git tag -a v2 -m tag main && 85 git format-patch --stdout --ignore-if-in-upstream v2..v1 >patch1 && 86 grep "^From " patch1 >from1 && 87 test_line_count = 2 from1 88' 89 90test_expect_success "format-patch doesn't consider merge commits" ' 91 git checkout -b feature main && 92 echo "Another line" >>file && 93 test_tick && 94 git commit -am "Feature branch change #1" && 95 echo "Yet another line" >>file && 96 test_tick && 97 git commit -am "Feature branch change #2" && 98 git checkout -b merger main && 99 test_tick && 100 git merge --no-ff feature && 101 git format-patch -3 --stdout >patch && 102 grep "^From " patch >from && 103 test_line_count = 3 from 104' 105 106test_expect_success 'format-patch result applies' ' 107 git checkout -b rebuild-0 main && 108 git am -3 patch0 && 109 git rev-list main.. >list && 110 test_line_count = 2 list 111' 112 113test_expect_success 'format-patch --ignore-if-in-upstream result applies' ' 114 git checkout -b rebuild-1 main && 115 git am -3 patch1 && 116 git rev-list main.. >list && 117 test_line_count = 2 list 118' 119 120test_expect_success 'commit did not screw up the log message' ' 121 git cat-file commit side >actual && 122 grep "^Side .* with .* backslash-n" actual 123' 124 125test_expect_success 'format-patch did not screw up the log message' ' 126 grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 && 127 grep "^Subject: .*Side changes #3 with .* backslash-n" patch1 128' 129 130test_expect_success 'replay did not screw up the log message' ' 131 git cat-file commit rebuild-1 >actual && 132 grep "^Side .* with .* backslash-n" actual 133' 134 135test_expect_success 'format-patch empty commit' ' 136 git format-patch --stdout main..empty >empty && 137 grep "^From " empty >from && 138 test_line_count = 1 from 139' 140 141test_expect_success 'extra headers' ' 142 git config format.headers "To: R E Cipient <rcipient@example.com> 143" && 144 git config --add format.headers "Cc: S E Cipient <scipient@example.com> 145" && 146 git format-patch --stdout main..side >patch2 && 147 sed -e "/^\$/q" patch2 >hdrs2 && 148 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs2 && 149 grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs2 150' 151 152test_expect_success 'extra headers without newlines' ' 153 git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && 154 git config --add format.headers "Cc: S E Cipient <scipient@example.com>" && 155 git format-patch --stdout main..side >patch3 && 156 sed -e "/^\$/q" patch3 >hdrs3 && 157 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs3 && 158 grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs3 159' 160 161test_expect_success 'extra headers with multiple To:s' ' 162 git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && 163 git config --add format.headers "To: S E Cipient <scipient@example.com>" && 164 git format-patch --stdout main..side >patch4 && 165 sed -e "/^\$/q" patch4 >hdrs4 && 166 grep "^To: R E Cipient <rcipient@example.com>,\$" hdrs4 && 167 grep "^ *S E Cipient <scipient@example.com>\$" hdrs4 168' 169 170test_expect_success 'additional command line cc (ascii)' ' 171 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && 172 git format-patch --cc="S E Cipient <scipient@example.com>" --stdout main..side >patch5 && 173 sed -e "/^\$/q" patch5 >hdrs5 && 174 grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 && 175 grep "^ *S E Cipient <scipient@example.com>\$" hdrs5 176' 177 178test_expect_failure 'additional command line cc (rfc822)' ' 179 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && 180 git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 && 181 sed -e "/^\$/q" patch5 >hdrs5 && 182 grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 && 183 grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5 184' 185 186test_expect_success 'command line headers' ' 187 git config --unset-all format.headers && 188 git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout main..side >patch6 && 189 sed -e "/^\$/q" patch6 >hdrs6 && 190 grep "^Cc: R E Cipient <rcipient@example.com>\$" hdrs6 191' 192 193test_expect_success 'configuration headers and command line headers' ' 194 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && 195 git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout main..side >patch7 && 196 sed -e "/^\$/q" patch7 >hdrs7 && 197 grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs7 && 198 grep "^ *S E Cipient <scipient@example.com>\$" hdrs7 199' 200 201test_expect_success 'command line To: header (ascii)' ' 202 git config --unset-all format.headers && 203 git format-patch --to="R E Cipient <rcipient@example.com>" --stdout main..side >patch8 && 204 sed -e "/^\$/q" patch8 >hdrs8 && 205 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs8 206' 207 208test_expect_failure 'command line To: header (rfc822)' ' 209 git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout main..side >patch8 && 210 sed -e "/^\$/q" patch8 >hdrs8 && 211 grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs8 212' 213 214test_expect_failure 'command line To: header (rfc2047)' ' 215 git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout main..side >patch8 && 216 sed -e "/^\$/q" patch8 >hdrs8 && 217 grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs8 218' 219 220test_expect_success 'configuration To: header (ascii)' ' 221 git config format.to "R E Cipient <rcipient@example.com>" && 222 git format-patch --stdout main..side >patch9 && 223 sed -e "/^\$/q" patch9 >hdrs9 && 224 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs9 225' 226 227test_expect_failure 'configuration To: header (rfc822)' ' 228 git config format.to "R. E. Cipient <rcipient@example.com>" && 229 git format-patch --stdout main..side >patch9 && 230 sed -e "/^\$/q" patch9 >hdrs9 && 231 grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs9 232' 233 234test_expect_failure 'configuration To: header (rfc2047)' ' 235 git config format.to "R Ä Cipient <rcipient@example.com>" && 236 git format-patch --stdout main..side >patch9 && 237 sed -e "/^\$/q" patch9 >hdrs9 && 238 grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs9 239' 240 241# check_patch <patch>: Verify that <patch> looks like a half-sane 242# patch email to avoid a false positive with !grep 243check_patch () { 244 grep -e "^From:" "$1" && 245 grep -e "^Date:" "$1" && 246 grep -e "^Subject:" "$1" 247} 248 249test_expect_success 'format.from=false' ' 250 git -c format.from=false format-patch --stdout main..side >patch && 251 sed -e "/^\$/q" patch >hdrs && 252 check_patch patch && 253 ! grep "^From: C O Mitter <committer@example.com>\$" hdrs 254' 255 256test_expect_success 'format.from=true' ' 257 git -c format.from=true format-patch --stdout main..side >patch && 258 sed -e "/^\$/q" patch >hdrs && 259 check_patch hdrs && 260 grep "^From: C O Mitter <committer@example.com>\$" hdrs 261' 262 263test_expect_success 'format.from with address' ' 264 git -c format.from="F R Om <from@example.com>" format-patch --stdout main..side >patch && 265 sed -e "/^\$/q" patch >hdrs && 266 check_patch hdrs && 267 grep "^From: F R Om <from@example.com>\$" hdrs 268' 269 270test_expect_success '--no-from overrides format.from' ' 271 git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout main..side >patch && 272 sed -e "/^\$/q" patch >hdrs && 273 check_patch hdrs && 274 ! grep "^From: F R Om <from@example.com>\$" hdrs 275' 276 277test_expect_success '--from overrides format.from' ' 278 git -c format.from="F R Om <from@example.com>" format-patch --from --stdout main..side >patch && 279 sed -e "/^\$/q" patch >hdrs && 280 check_patch hdrs && 281 ! grep "^From: F R Om <from@example.com>\$" hdrs 282' 283 284test_expect_success '--no-to overrides config.to' ' 285 git config --replace-all format.to \ 286 "R E Cipient <rcipient@example.com>" && 287 git format-patch --no-to --stdout main..side >patch10 && 288 sed -e "/^\$/q" patch10 >hdrs10 && 289 check_patch hdrs10 && 290 ! grep "^To: R E Cipient <rcipient@example.com>\$" hdrs10 291' 292 293test_expect_success '--no-to and --to replaces config.to' ' 294 git config --replace-all format.to \ 295 "Someone <someone@out.there>" && 296 git format-patch --no-to --to="Someone Else <else@out.there>" \ 297 --stdout main..side >patch11 && 298 sed -e "/^\$/q" patch11 >hdrs11 && 299 check_patch hdrs11 && 300 ! grep "^To: Someone <someone@out.there>\$" hdrs11 && 301 grep "^To: Someone Else <else@out.there>\$" hdrs11 302' 303 304test_expect_success '--no-cc overrides config.cc' ' 305 git config --replace-all format.cc \ 306 "C E Cipient <rcipient@example.com>" && 307 git format-patch --no-cc --stdout main..side >patch12 && 308 sed -e "/^\$/q" patch12 >hdrs12 && 309 check_patch hdrs12 && 310 ! grep "^Cc: C E Cipient <rcipient@example.com>\$" hdrs12 311' 312 313test_expect_success '--no-add-header overrides config.headers' ' 314 git config --replace-all format.headers \ 315 "Header1: B E Cipient <rcipient@example.com>" && 316 git format-patch --no-add-header --stdout main..side >patch13 && 317 sed -e "/^\$/q" patch13 >hdrs13 && 318 check_patch hdrs13 && 319 ! grep "^Header1: B E Cipient <rcipient@example.com>\$" hdrs13 320' 321 322test_expect_success 'multiple files' ' 323 rm -rf patches/ && 324 git checkout side && 325 git format-patch -o patches/ main && 326 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 327' 328 329test_expect_success 'filename length limit' ' 330 test_when_finished "rm -f 000*" && 331 rm -rf 000[1-9]-*.patch && 332 for len in 15 25 35 333 do 334 git format-patch --filename-max-length=$len -3 side && 335 max=$( 336 for patch in 000[1-9]-*.patch 337 do 338 echo "$patch" | wc -c || exit 1 339 done | 340 sort -nr | 341 head -n 1 342 ) && 343 test $max -le $len || return 1 344 done 345' 346 347test_expect_success 'filename length limit from config' ' 348 test_when_finished "rm -f 000*" && 349 rm -rf 000[1-9]-*.patch && 350 for len in 15 25 35 351 do 352 git -c format.filenameMaxLength=$len format-patch -3 side && 353 max=$( 354 for patch in 000[1-9]-*.patch 355 do 356 echo "$patch" | wc -c || exit 1 357 done | 358 sort -nr | 359 head -n 1 360 ) && 361 test $max -le $len || return 1 362 done 363' 364 365test_expect_success 'filename limit applies only to basename' ' 366 test_when_finished "rm -rf patches/" && 367 rm -rf patches/ && 368 for len in 15 25 35 369 do 370 git format-patch -o patches --filename-max-length=$len -3 side && 371 max=$( 372 for patch in patches/000[1-9]-*.patch 373 do 374 echo "${patch#patches/}" | wc -c || exit 1 375 done | 376 sort -nr | 377 head -n 1 378 ) && 379 test $max -le $len || return 1 380 done 381' 382 383test_expect_success 'reroll count' ' 384 rm -fr patches && 385 git format-patch -o patches --cover-letter --reroll-count 4 main..side >list && 386 ! grep -v "^patches/v4-000[0-3]-" list && 387 sed -n -e "/^Subject: /p" $(cat list) >subjects && 388 ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects 389' 390 391test_expect_success 'reroll count (-v)' ' 392 rm -fr patches && 393 git format-patch -o patches --cover-letter -v4 main..side >list && 394 ! grep -v "^patches/v4-000[0-3]-" list && 395 sed -n -e "/^Subject: /p" $(cat list) >subjects && 396 ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects 397' 398 399test_expect_success 'reroll count (-v) with a fractional number' ' 400 rm -fr patches && 401 git format-patch -o patches --cover-letter -v4.4 main..side >list && 402 ! grep -v "^patches/v4.4-000[0-3]-" list && 403 sed -n -e "/^Subject: /p" $(cat list) >subjects && 404 ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects 405' 406 407test_expect_success 'reroll (-v) count with a non number' ' 408 rm -fr patches && 409 git format-patch -o patches --cover-letter -v4rev2 main..side >list && 410 ! grep -v "^patches/v4rev2-000[0-3]-" list && 411 sed -n -e "/^Subject: /p" $(cat list) >subjects && 412 ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects 413' 414 415test_expect_success 'reroll (-v) count with a non-pathname character' ' 416 rm -fr patches && 417 git format-patch -o patches --cover-letter -v4---..././../--1/.2// main..side >list && 418 ! grep -v "patches/v4-\.-\.-\.-1-\.2-000[0-3]-" list && 419 sed -n -e "/^Subject: /p" $(cat list) >subjects && 420 ! grep -v "^Subject: \[PATCH v4---\.\.\./\./\.\./--1/\.2// [0-3]/3\] " subjects 421' 422 423check_threading () { 424 expect="$1" && 425 shift && 426 git format-patch --stdout "$@" >patch && 427 # Prints everything between the Message-ID and In-Reply-To, 428 # and replaces all Message-ID-lookalikes by a sequence number 429 perl -ne ' 430 if (/^(message-id|references|in-reply-to)/i) { 431 $printing = 1; 432 } elsif (/^\S/) { 433 $printing = 0; 434 } 435 if ($printing) { 436 $h{$1}=$i++ if (/<([^>]+)>/ and !exists $h{$1}); 437 for $k (keys %h) {s/$k/$h{$k}/}; 438 print; 439 } 440 print "---\n" if /^From /i; 441 ' <patch >actual && 442 test_cmp "$expect" actual 443} 444 445cat >>expect.no-threading <<EOF 446--- 447--- 448--- 449EOF 450 451test_expect_success PERL_TEST_HELPERS 'no threading' ' 452 git checkout side && 453 check_threading expect.no-threading main 454' 455 456cat >expect.thread <<EOF 457--- 458Message-ID: <0> 459--- 460Message-ID: <1> 461In-Reply-To: <0> 462References: <0> 463--- 464Message-ID: <2> 465In-Reply-To: <0> 466References: <0> 467EOF 468 469test_expect_success PERL_TEST_HELPERS 'thread' ' 470 check_threading expect.thread --thread main 471' 472 473test_expect_success PERL_TEST_HELPERS '--thread overrides format.thread=deep' ' 474 test_config format.thread deep && 475 check_threading expect.thread --thread main 476' 477 478cat >expect.in-reply-to <<EOF 479--- 480Message-ID: <0> 481In-Reply-To: <1> 482References: <1> 483--- 484Message-ID: <2> 485In-Reply-To: <1> 486References: <1> 487--- 488Message-ID: <3> 489In-Reply-To: <1> 490References: <1> 491EOF 492 493test_expect_success PERL_TEST_HELPERS 'thread in-reply-to' ' 494 check_threading expect.in-reply-to --in-reply-to="<test.message>" \ 495 --thread main 496' 497 498cat >expect.cover-letter <<EOF 499--- 500Message-ID: <0> 501--- 502Message-ID: <1> 503In-Reply-To: <0> 504References: <0> 505--- 506Message-ID: <2> 507In-Reply-To: <0> 508References: <0> 509--- 510Message-ID: <3> 511In-Reply-To: <0> 512References: <0> 513EOF 514 515test_expect_success PERL_TEST_HELPERS 'thread cover-letter' ' 516 check_threading expect.cover-letter --cover-letter --thread main 517' 518 519cat >expect.cl-irt <<EOF 520--- 521Message-ID: <0> 522In-Reply-To: <1> 523References: <1> 524--- 525Message-ID: <2> 526In-Reply-To: <0> 527References: <1> 528 <0> 529--- 530Message-ID: <3> 531In-Reply-To: <0> 532References: <1> 533 <0> 534--- 535Message-ID: <4> 536In-Reply-To: <0> 537References: <1> 538 <0> 539EOF 540 541test_expect_success PERL_TEST_HELPERS 'thread cover-letter in-reply-to' ' 542 check_threading expect.cl-irt --cover-letter \ 543 --in-reply-to="<test.message>" --thread main 544' 545 546test_expect_success PERL_TEST_HELPERS 'thread explicit shallow' ' 547 check_threading expect.cl-irt --cover-letter \ 548 --in-reply-to="<test.message>" --thread=shallow main 549' 550 551cat >expect.deep <<EOF 552--- 553Message-ID: <0> 554--- 555Message-ID: <1> 556In-Reply-To: <0> 557References: <0> 558--- 559Message-ID: <2> 560In-Reply-To: <1> 561References: <0> 562 <1> 563EOF 564 565test_expect_success PERL_TEST_HELPERS 'thread deep' ' 566 check_threading expect.deep --thread=deep main 567' 568 569cat >expect.deep-irt <<EOF 570--- 571Message-ID: <0> 572In-Reply-To: <1> 573References: <1> 574--- 575Message-ID: <2> 576In-Reply-To: <0> 577References: <1> 578 <0> 579--- 580Message-ID: <3> 581In-Reply-To: <2> 582References: <1> 583 <0> 584 <2> 585EOF 586 587test_expect_success PERL_TEST_HELPERS 'thread deep in-reply-to' ' 588 check_threading expect.deep-irt --thread=deep \ 589 --in-reply-to="<test.message>" main 590' 591 592cat >expect.deep-cl <<EOF 593--- 594Message-ID: <0> 595--- 596Message-ID: <1> 597In-Reply-To: <0> 598References: <0> 599--- 600Message-ID: <2> 601In-Reply-To: <1> 602References: <0> 603 <1> 604--- 605Message-ID: <3> 606In-Reply-To: <2> 607References: <0> 608 <1> 609 <2> 610EOF 611 612test_expect_success PERL_TEST_HELPERS 'thread deep cover-letter' ' 613 check_threading expect.deep-cl --cover-letter --thread=deep main 614' 615 616cat >expect.deep-cl-irt <<EOF 617--- 618Message-ID: <0> 619In-Reply-To: <1> 620References: <1> 621--- 622Message-ID: <2> 623In-Reply-To: <0> 624References: <1> 625 <0> 626--- 627Message-ID: <3> 628In-Reply-To: <2> 629References: <1> 630 <0> 631 <2> 632--- 633Message-ID: <4> 634In-Reply-To: <3> 635References: <1> 636 <0> 637 <2> 638 <3> 639EOF 640 641test_expect_success PERL_TEST_HELPERS 'thread deep cover-letter in-reply-to' ' 642 check_threading expect.deep-cl-irt --cover-letter \ 643 --in-reply-to="<test.message>" --thread=deep main 644' 645 646test_expect_success PERL_TEST_HELPERS 'thread via config' ' 647 test_config format.thread true && 648 check_threading expect.thread main 649' 650 651test_expect_success PERL_TEST_HELPERS 'thread deep via config' ' 652 test_config format.thread deep && 653 check_threading expect.deep main 654' 655 656test_expect_success PERL_TEST_HELPERS 'thread config + override' ' 657 test_config format.thread deep && 658 check_threading expect.thread --thread main 659' 660 661test_expect_success PERL_TEST_HELPERS 'thread config + --no-thread' ' 662 test_config format.thread deep && 663 check_threading expect.no-threading --no-thread main 664' 665 666test_expect_success 'excessive subject' ' 667 rm -rf patches/ && 668 git checkout side && 669 before=$(git hash-object file) && 670 before=$(git rev-parse --short $before) && 671 test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >>file && 672 after=$(git hash-object file) && 673 after=$(git rev-parse --short $after) && 674 git update-index file && 675 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." && 676 git format-patch -o patches/ main..side && 677 ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch 678' 679 680test_expect_success 'failure to write cover-letter aborts gracefully' ' 681 test_when_finished "rmdir 0000-cover-letter.patch" && 682 mkdir 0000-cover-letter.patch && 683 test_must_fail git format-patch --no-renames --cover-letter -1 684' 685 686test_expect_success 'cover-letter inherits diff options' ' 687 git mv file foo && 688 git commit -m foo && 689 git format-patch --no-renames --cover-letter -1 && 690 check_patch 0000-cover-letter.patch && 691 ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch && 692 git format-patch --cover-letter -1 -M && 693 grep "file => foo .* 0 *\$" 0000-cover-letter.patch 694' 695 696cat >expect <<EOF 697 This is an excessively long subject line for a message due to the 698 habit some projects have of not having a short, one-line subject at 699 the start of the commit message, but rather sticking a whole 700 paragraph right at the start as the only thing in the commit 701 message. It had better not become the filename for the patch. 702 foo 703 704EOF 705 706test_expect_success 'shortlog of cover-letter wraps overly-long onelines' ' 707 git format-patch --cover-letter -2 && 708 sed -e "1,/A U Thor/d" -e "/^\$/q" 0000-cover-letter.patch >output && 709 test_cmp expect output 710' 711 712cat >expect <<EOF 713index $before..$after 100644 714--- a/file 715+++ b/file 716@@ -13,4 +13,20 @@ C 717 10 718 D 719 E 720 F 721+5 722EOF 723 724test_expect_success 'format-patch respects -U' ' 725 git format-patch -U4 -2 && 726 sed -e "1,/^diff/d" -e "/^+5/q" \ 727 <0001-This-is-an-excessively-long-subject-line-for-a-messa.patch \ 728 >output && 729 test_cmp expect output 730' 731 732cat >expect <<EOF 733 734diff --git a/file b/file 735index $before..$after 100644 736--- a/file 737+++ b/file 738@@ -14,3 +14,19 @@ C 739 D 740 E 741 F 742+5 743EOF 744 745test_expect_success 'format-patch -p suppresses stat' ' 746 git format-patch -p -2 && 747 sed -e "1,/^\$/d" -e "/^+5/q" 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch >output && 748 test_cmp expect output 749' 750 751test_expect_success 'format-patch from a subdirectory (1)' ' 752 filename=$( 753 rm -rf sub && 754 mkdir -p sub/dir && 755 cd sub/dir && 756 git format-patch -1 757 ) && 758 case "$filename" in 759 0*) 760 ;; # ok 761 *) 762 echo "Oops? $filename" 763 false 764 ;; 765 esac && 766 test -f "$filename" 767' 768 769test_expect_success 'format-patch from a subdirectory (2)' ' 770 filename=$( 771 rm -rf sub && 772 mkdir -p sub/dir && 773 cd sub/dir && 774 git format-patch -1 -o .. 775 ) && 776 case "$filename" in 777 ../0*) 778 ;; # ok 779 *) 780 echo "Oops? $filename" 781 false 782 ;; 783 esac && 784 basename=$(expr "$filename" : ".*/\(.*\)") && 785 test -f "sub/$basename" 786' 787 788test_expect_success 'format-patch from a subdirectory (3)' ' 789 rm -f 0* && 790 filename=$( 791 rm -rf sub && 792 mkdir -p sub/dir && 793 cd sub/dir && 794 git format-patch -1 -o "$TRASH_DIRECTORY" 795 ) && 796 basename=$(expr "$filename" : ".*/\(.*\)") && 797 test -f "$basename" 798' 799 800test_expect_success 'format-patch --in-reply-to' ' 801 git format-patch -1 --stdout --in-reply-to "baz@foo.bar" >patch8 && 802 grep "^In-Reply-To: <baz@foo.bar>" patch8 && 803 grep "^References: <baz@foo.bar>" patch8 804' 805 806test_expect_success 'format-patch --signoff' ' 807 git format-patch -1 --signoff --stdout >out && 808 grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out 809' 810 811test_expect_success 'format-patch --notes --signoff' ' 812 git notes --ref test add -m "test message" HEAD && 813 git format-patch -1 --signoff --stdout --notes=test >out && 814 # Three dashes must come after S-o-b 815 ! sed "/^Signed-off-by: /q" out | grep "test message" && 816 sed "1,/^Signed-off-by: /d" out | grep "test message" && 817 # Notes message must come after three dashes 818 ! sed "/^---$/q" out | grep "test message" && 819 sed "1,/^---$/d" out | grep "test message" 820' 821 822test_expect_success 'format-patch notes output control' ' 823 test_when_finished "git notes remove HEAD || :" && 824 git notes add -m "notes config message" HEAD && 825 826 git format-patch -1 --stdout >out && 827 ! grep "notes config message" out && 828 git format-patch -1 --stdout --notes >out && 829 grep "notes config message" out && 830 git format-patch -1 --stdout --no-notes >out && 831 ! grep "notes config message" out && 832 git format-patch -1 --stdout --notes --no-notes >out && 833 ! grep "notes config message" out && 834 git format-patch -1 --stdout --no-notes --notes >out && 835 grep "notes config message" out && 836 837 test_config format.notes true && 838 git format-patch -1 --stdout >out && 839 grep "notes config message" out && 840 git format-patch -1 --stdout --notes >out && 841 grep "notes config message" out && 842 git format-patch -1 --stdout --no-notes >out && 843 ! grep "notes config message" out && 844 git format-patch -1 --stdout --notes --no-notes >out && 845 ! grep "notes config message" out && 846 git format-patch -1 --stdout --no-notes --notes >out && 847 grep "notes config message" out 848' 849 850test_expect_success 'format-patch with multiple notes refs' ' 851 test_when_finished "git notes --ref note1 remove HEAD; 852 git notes --ref note2 remove HEAD || :" && 853 git notes --ref note1 add -m "this is note 1" HEAD && 854 git notes --ref note2 add -m "this is note 2" HEAD && 855 856 git format-patch -1 --stdout >out && 857 ! grep "this is note 1" out && 858 ! grep "this is note 2" out && 859 git format-patch -1 --stdout --notes=note1 >out && 860 grep "this is note 1" out && 861 ! grep "this is note 2" out && 862 git format-patch -1 --stdout --notes=note2 >out && 863 ! grep "this is note 1" out && 864 grep "this is note 2" out && 865 git format-patch -1 --stdout --notes=note1 --notes=note2 >out && 866 grep "this is note 1" out && 867 grep "this is note 2" out && 868 869 test_config format.notes note1 && 870 git format-patch -1 --stdout >out && 871 grep "this is note 1" out && 872 ! grep "this is note 2" out && 873 git format-patch -1 --stdout --no-notes >out && 874 ! grep "this is note 1" out && 875 ! grep "this is note 2" out && 876 git format-patch -1 --stdout --notes=note2 >out && 877 grep "this is note 1" out && 878 grep "this is note 2" out && 879 git format-patch -1 --stdout --no-notes --notes=note2 >out && 880 ! grep "this is note 1" out && 881 grep "this is note 2" out && 882 883 git config --add format.notes note2 && 884 git format-patch -1 --stdout >out && 885 grep "this is note 1" out && 886 grep "this is note 2" out && 887 git format-patch -1 --stdout --no-notes >out && 888 ! grep "this is note 1" out && 889 ! grep "this is note 2" out 890' 891 892test_expect_success 'format-patch with multiple notes refs in config' ' 893 test_when_finished "test_unconfig format.notes" && 894 895 test_when_finished "git notes --ref note1 remove HEAD; 896 git notes --ref note2 remove HEAD || :" && 897 git notes --ref note1 add -m "this is note 1" HEAD && 898 git notes --ref note2 add -m "this is note 2" HEAD && 899 900 git config format.notes note1 && 901 git format-patch -1 --stdout >out && 902 grep "this is note 1" out && 903 ! grep "this is note 2" out && 904 git config format.notes note2 && 905 git format-patch -1 --stdout >out && 906 ! grep "this is note 1" out && 907 grep "this is note 2" out && 908 git config --add format.notes note1 && 909 git format-patch -1 --stdout >out && 910 grep "this is note 1" out && 911 grep "this is note 2" out && 912 913 git config --replace-all format.notes note1 && 914 git config --add format.notes false && 915 git format-patch -1 --stdout >out && 916 ! grep "this is note 1" out && 917 ! grep "this is note 2" out && 918 git config --add format.notes note2 && 919 git format-patch -1 --stdout >out && 920 ! grep "this is note 1" out && 921 grep "this is note 2" out 922' 923 924echo "fatal: --name-only does not make sense" >expect.name-only 925echo "fatal: --name-status does not make sense" >expect.name-status 926echo "fatal: --check does not make sense" >expect.check 927 928test_expect_success 'options no longer allowed for format-patch' ' 929 test_must_fail git format-patch --name-only 2>output && 930 test_cmp expect.name-only output && 931 test_must_fail git format-patch --name-status 2>output && 932 test_cmp expect.name-status output && 933 test_must_fail git format-patch --check 2>output && 934 test_cmp expect.check output 935' 936 937test_expect_success 'format-patch --numstat should produce a patch' ' 938 git format-patch --numstat --stdout main..side >output && 939 grep "^diff --git a/" output >diff && 940 test_line_count = 5 diff 941' 942 943test_expect_success 'format-patch -- <path>' ' 944 rm -f *.patch && 945 git checkout -b pathspec main && 946 947 echo file_a 1 >file_a && 948 echo file_b 1 >file_b && 949 git add file_a file_b && 950 git commit -m pathspec_initial && 951 952 echo file_a 2 >>file_a && 953 git add file_a && 954 git commit -m pathspec_a && 955 956 echo file_b 2 >>file_b && 957 git add file_b && 958 git commit -m pathspec_b && 959 960 echo file_a 3 >>file_a && 961 echo file_b 3 >>file_b && 962 git add file_a file_b && 963 git commit -m pathspec_ab && 964 965 cat >expect <<-\EOF && 966 0001-pathspec_initial.patch 967 0002-pathspec_a.patch 968 0003-pathspec_ab.patch 969 EOF 970 971 git format-patch main..pathspec -- file_a >output && 972 test_cmp expect output && 973 ! grep file_b *.patch 974' 975 976test_expect_success 'format-patch --ignore-if-in-upstream HEAD' ' 977 git checkout side && 978 git format-patch --ignore-if-in-upstream HEAD 979' 980 981test_expect_success 'get git version' ' 982 git_version=$(git --version) && 983 git_version=${git_version##* } 984' 985 986signature() { 987 printf "%s\n%s\n\n" "-- " "${1:-$git_version}" 988} 989 990test_expect_success 'format-patch default signature' ' 991 git format-patch --stdout -1 >patch && 992 tail -n 3 patch >output && 993 signature >expect && 994 test_cmp expect output 995' 996 997test_expect_success 'format-patch --signature' ' 998 git format-patch --stdout --signature="my sig" -1 >patch && 999 tail -n 3 patch >output && 1000 signature "my sig" >expect && 1001 test_cmp expect output 1002' 1003 1004test_expect_success 'format-patch with format.signature config' ' 1005 git config format.signature "config sig" && 1006 git format-patch --stdout -1 >output && 1007 grep "config sig" output 1008' 1009 1010test_expect_success 'format-patch --signature overrides format.signature' ' 1011 git config format.signature "config sig" && 1012 git format-patch --stdout --signature="overrides" -1 >output && 1013 ! grep "config sig" output && 1014 grep "overrides" output 1015' 1016 1017test_expect_success 'format-patch --no-signature ignores format.signature' ' 1018 git config format.signature "config sig" && 1019 git format-patch --stdout --signature="my sig" --no-signature \ 1020 -1 >output && 1021 check_patch output && 1022 ! grep "config sig" output && 1023 ! grep "my sig" output && 1024 ! grep "^-- \$" output 1025' 1026 1027test_expect_success 'format-patch --signature --cover-letter' ' 1028 git config --unset-all format.signature && 1029 git format-patch --stdout --signature="my sig" --cover-letter \ 1030 -1 >output && 1031 grep "my sig" output >sig && 1032 test_line_count = 2 sig 1033' 1034 1035test_expect_success 'format.signature="" suppresses signatures' ' 1036 git config format.signature "" && 1037 git format-patch --stdout -1 >output && 1038 check_patch output && 1039 ! grep "^-- \$" output 1040' 1041 1042test_expect_success 'format-patch --no-signature suppresses signatures' ' 1043 git config --unset-all format.signature && 1044 git format-patch --stdout --no-signature -1 >output && 1045 check_patch output && 1046 ! grep "^-- \$" output 1047' 1048 1049test_expect_success 'format-patch --signature="" suppresses signatures' ' 1050 git format-patch --stdout --signature="" -1 >output && 1051 check_patch output && 1052 ! grep "^-- \$" output 1053' 1054 1055test_expect_success 'prepare mail-signature input' ' 1056 cat >mail-signature <<-\EOF 1057 1058 Test User <test.email@kernel.org> 1059 http://git.kernel.org/cgit/git/git.git 1060 1061 git.kernel.org/?p=git/git.git;a=summary 1062 1063 EOF 1064' 1065 1066test_expect_success '--signature-file=file works' ' 1067 git format-patch --stdout --signature-file=mail-signature -1 >output && 1068 check_patch output && 1069 sed -e "1,/^-- \$/d" output >actual && 1070 { 1071 cat mail-signature && echo 1072 } >expect && 1073 test_cmp expect actual 1074' 1075 1076test_expect_success 'format.signaturefile works' ' 1077 test_config format.signaturefile mail-signature && 1078 git format-patch --stdout -1 >output && 1079 check_patch output && 1080 sed -e "1,/^-- \$/d" output >actual && 1081 { 1082 cat mail-signature && echo 1083 } >expect && 1084 test_cmp expect actual 1085' 1086 1087test_expect_success '--no-signature suppresses format.signaturefile ' ' 1088 test_config format.signaturefile mail-signature && 1089 git format-patch --stdout --no-signature -1 >output && 1090 check_patch output && 1091 ! grep "^-- \$" output 1092' 1093 1094test_expect_success '--signature-file overrides format.signaturefile' ' 1095 cat >other-mail-signature <<-\EOF && 1096 Use this other signature instead of mail-signature. 1097 EOF 1098 test_config format.signaturefile mail-signature && 1099 git format-patch --stdout \ 1100 --signature-file=other-mail-signature -1 >output && 1101 check_patch output && 1102 sed -e "1,/^-- \$/d" output >actual && 1103 { 1104 cat other-mail-signature && echo 1105 } >expect && 1106 test_cmp expect actual 1107' 1108 1109test_expect_success '--signature overrides format.signaturefile' ' 1110 test_config format.signaturefile mail-signature && 1111 git format-patch --stdout --signature="my sig" -1 >output && 1112 check_patch output && 1113 grep "my sig" output 1114' 1115 1116test_expect_success TTY 'format-patch --stdout paginates' ' 1117 rm -f pager_used && 1118 test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all && 1119 test_path_is_file pager_used 1120' 1121 1122 test_expect_success TTY 'format-patch --stdout pagination can be disabled' ' 1123 rm -f pager_used && 1124 test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all && 1125 test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all && 1126 test_path_is_missing pager_used && 1127 test_path_is_missing .git/pager_used 1128' 1129 1130test_expect_success 'format-patch handles multi-line subjects' ' 1131 rm -rf patches/ && 1132 echo content >>file && 1133 test_write_lines one two three >msg && 1134 git add file && 1135 git commit -F msg && 1136 git format-patch -o patches -1 && 1137 grep ^Subject: patches/0001-one.patch >actual && 1138 echo "Subject: [PATCH] one two three" >expect && 1139 test_cmp expect actual 1140' 1141 1142test_expect_success 'format-patch handles multi-line encoded subjects' ' 1143 rm -rf patches/ && 1144 echo content >>file && 1145 test_write_lines en två tre >msg && 1146 git add file && 1147 git commit -F msg && 1148 git format-patch -o patches -1 && 1149 grep ^Subject: patches/0001-en.patch >actual && 1150 echo "Subject: [PATCH] =?UTF-8?q?en=20tv=C3=A5=20tre?=" >expect && 1151 test_cmp expect actual 1152' 1153 1154M8="foo bar " 1155M64=$M8$M8$M8$M8$M8$M8$M8$M8 1156M512=$M64$M64$M64$M64$M64$M64$M64$M64 1157cat >expect <<'EOF' 1158Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo 1159 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar 1160 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo 1161 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar 1162 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo 1163 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar 1164 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar 1165EOF 1166test_expect_success 'format-patch wraps extremely long subject (ascii)' ' 1167 echo content >>file && 1168 git add file && 1169 git commit -m "$M512" && 1170 git format-patch --stdout -1 >patch && 1171 sed -n "/^Subject/p; /^ /p; /^$/q" patch >subject && 1172 test_cmp expect subject 1173' 1174 1175M8="föö bar " 1176M64=$M8$M8$M8$M8$M8$M8$M8$M8 1177M512=$M64$M64$M64$M64$M64$M64$M64$M64 1178cat >expect <<'EOF' 1179Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= 1180 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= 1181 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= 1182 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= 1183 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= 1184 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= 1185 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= 1186 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= 1187 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= 1188 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= 1189 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= 1190 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= 1191 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= 1192 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= 1193 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= 1194 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= 1195 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= 1196 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= 1197 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= 1198 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= 1199 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= 1200 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= 1201 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= 1202 =?UTF-8?q?bar?= 1203EOF 1204test_expect_success 'format-patch wraps extremely long subject (rfc2047)' ' 1205 rm -rf patches/ && 1206 echo content >>file && 1207 git add file && 1208 git commit -m "$M512" && 1209 git format-patch --stdout -1 >patch && 1210 sed -n "/^Subject/p; /^ /p; /^$/q" patch >subject && 1211 test_cmp expect subject 1212' 1213 1214check_author() { 1215 echo content >>file && 1216 git add file && 1217 GIT_AUTHOR_NAME=$1 git commit -m author-check && 1218 git format-patch --stdout -1 >patch && 1219 sed -n "/^From: /p; /^ /p; /^$/q" patch >actual && 1220 test_cmp expect actual 1221} 1222 1223cat >expect <<'EOF' 1224From: "Foo B. Bar" <author@example.com> 1225EOF 1226test_expect_success 'format-patch quotes dot in from-headers' ' 1227 check_author "Foo B. Bar" 1228' 1229 1230cat >expect <<'EOF' 1231From: "Foo \"The Baz\" Bar" <author@example.com> 1232EOF 1233test_expect_success 'format-patch quotes double-quote in from-headers' ' 1234 check_author "Foo \"The Baz\" Bar" 1235' 1236 1237cat >expect <<'EOF' 1238From: =?UTF-8?q?F=C3=B6o=20Bar?= <author@example.com> 1239EOF 1240test_expect_success 'format-patch uses rfc2047-encoded from-headers when necessary' ' 1241 check_author "Föo Bar" 1242' 1243 1244cat >expect <<'EOF' 1245From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= <author@example.com> 1246EOF 1247test_expect_success 'rfc2047-encoded from-headers leave no rfc822 specials' ' 1248 check_author "Föo B. Bar" 1249' 1250 1251cat >expect <<EOF 1252From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_ 1253 <author@example.com> 1254EOF 1255test_expect_success 'format-patch wraps moderately long from-header (ascii)' ' 1256 check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_" 1257' 1258 1259cat >expect <<'EOF' 1260From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar 1261 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo 1262 Bar Foo Bar Foo Bar Foo Bar <author@example.com> 1263EOF 1264test_expect_success 'format-patch wraps extremely long from-header (ascii)' ' 1265 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" 1266' 1267 1268cat >expect <<'EOF' 1269From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar 1270 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo 1271 Bar Foo Bar Foo Bar Foo Bar" <author@example.com> 1272EOF 1273test_expect_success 'format-patch wraps extremely long from-header (rfc822)' ' 1274 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" 1275' 1276 1277cat >expect <<'EOF' 1278From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?= 1279 =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?= 1280 =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?= 1281 =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?= 1282 =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= <author@example.com> 1283EOF 1284test_expect_success 'format-patch wraps extremely long from-header (rfc2047)' ' 1285 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" 1286' 1287 1288cat >expect <<'EOF' 1289From: Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar 1290 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo 1291 Bar Foo Bar Foo Bar Foo Bar <author@example.com> 1292EOF 1293test_expect_success 'format-patch wraps extremely long from-header (non-ASCII without Q-encoding)' ' 1294 echo content >>file && 1295 git add file && 1296 GIT_AUTHOR_NAME="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" \ 1297 git commit -m author-check && 1298 git format-patch --no-encode-email-headers --stdout -1 >patch && 1299 sed -n "/^From: /p; /^ /p; /^$/q" patch >actual && 1300 test_cmp expect actual 1301' 1302 1303cat >expect <<'EOF' 1304Subject: [PATCH] Foö 1305EOF 1306test_expect_success 'subject lines are unencoded with --no-encode-email-headers' ' 1307 echo content >>file && 1308 git add file && 1309 git commit -m "Foö" && 1310 git format-patch --no-encode-email-headers -1 --stdout >patch && 1311 grep ^Subject: patch >actual && 1312 test_cmp expect actual 1313' 1314 1315cat >expect <<'EOF' 1316Subject: [PATCH] Foö 1317EOF 1318test_expect_success 'subject lines are unencoded with format.encodeEmailHeaders=false' ' 1319 echo content >>file && 1320 git add file && 1321 git commit -m "Foö" && 1322 git config format.encodeEmailHeaders false && 1323 git format-patch -1 --stdout >patch && 1324 grep ^Subject: patch >actual && 1325 test_cmp expect actual 1326' 1327 1328cat >expect <<'EOF' 1329Subject: [PATCH] =?UTF-8?q?Fo=C3=B6?= 1330EOF 1331test_expect_success '--encode-email-headers overrides format.encodeEmailHeaders' ' 1332 echo content >>file && 1333 git add file && 1334 git commit -m "Foö" && 1335 git config format.encodeEmailHeaders false && 1336 git format-patch --encode-email-headers -1 --stdout >patch && 1337 grep ^Subject: patch >actual && 1338 test_cmp expect actual 1339' 1340 1341cat >expect <<'EOF' 1342Subject: header with . in it 1343EOF 1344test_expect_success 'subject lines do not have 822 atom-quoting' ' 1345 echo content >>file && 1346 git add file && 1347 git commit -m "header with . in it" && 1348 git format-patch -k -1 --stdout >patch && 1349 grep ^Subject: patch >actual && 1350 test_cmp expect actual 1351' 1352 1353cat >expect <<'EOF' 1354Subject: [PREFIX 1/1] header with . in it 1355EOF 1356test_expect_success 'subject prefixes have space prepended' ' 1357 git format-patch -n -1 --stdout --subject-prefix=PREFIX >patch && 1358 grep ^Subject: patch >actual && 1359 test_cmp expect actual 1360' 1361 1362cat >expect <<'EOF' 1363Subject: [1/1] header with . in it 1364EOF 1365test_expect_success 'empty subject prefix does not have extra space' ' 1366 git format-patch -n -1 --stdout --subject-prefix= >patch && 1367 grep ^Subject: patch >actual && 1368 test_cmp expect actual 1369' 1370 1371test_expect_success '--rfc and --no-rfc' ' 1372 cat >expect <<-\EOF && 1373 Subject: [RFC PATCH 1/1] header with . in it 1374 EOF 1375 git format-patch -n -1 --stdout --rfc >patch && 1376 grep "^Subject:" patch >actual && 1377 test_cmp expect actual && 1378 git format-patch -n -1 --stdout --rfc --no-rfc >patch && 1379 sed -e "s/RFC //" expect >expect-raw && 1380 grep "^Subject:" patch >actual && 1381 test_cmp expect-raw actual 1382' 1383 1384test_expect_success '--rfc=WIP and --rfc=' ' 1385 cat >expect <<-\EOF && 1386 Subject: [WIP PATCH 1/1] header with . in it 1387 EOF 1388 git format-patch -n -1 --stdout --rfc=WIP >patch && 1389 grep "^Subject:" patch >actual && 1390 test_cmp expect actual && 1391 git format-patch -n -1 --stdout --rfc --rfc= >patch && 1392 sed -e "s/WIP //" expect >expect-raw && 1393 grep "^Subject:" patch >actual && 1394 test_cmp expect-raw actual 1395' 1396 1397test_expect_success '--rfc=-(WIP) appends' ' 1398 cat >expect <<-\EOF && 1399 Subject: [PATCH (WIP) 1/1] header with . in it 1400 EOF 1401 git format-patch -n -1 --stdout --rfc="-(WIP)" >patch && 1402 grep "^Subject:" patch >actual && 1403 test_cmp expect actual 1404' 1405 1406test_expect_success '--rfc does not overwrite prefix' ' 1407 cat >expect <<-\EOF && 1408 Subject: [RFC PATCH foobar 1/1] header with . in it 1409 EOF 1410 git -c format.subjectPrefix="PATCH foobar" \ 1411 format-patch -n -1 --stdout --rfc >patch && 1412 grep "^Subject:" patch >actual && 1413 test_cmp expect actual 1414' 1415 1416test_expect_success '--rfc is argument order independent' ' 1417 cat >expect <<-\EOF && 1418 Subject: [RFC PATCH foobar 1/1] header with . in it 1419 EOF 1420 git format-patch -n -1 --stdout --rfc \ 1421 --subject-prefix="PATCH foobar" >patch && 1422 grep "^Subject:" patch >actual && 1423 test_cmp expect actual 1424' 1425 1426test_expect_success '--subject-prefix="<non-empty>" and -k cannot be used together' ' 1427 echo "fatal: options '\''--subject-prefix/--rfc'\'' and '\''-k'\'' cannot be used together" >expect.err && 1428 test_must_fail git format-patch -1 --stdout --subject-prefix="MYPREFIX" -k >actual.out 2>actual.err && 1429 test_must_be_empty actual.out && 1430 test_cmp expect.err actual.err 1431' 1432 1433test_expect_success '--subject-prefix="" and -k cannot be used together' ' 1434 echo "fatal: options '\''--subject-prefix/--rfc'\'' and '\''-k'\'' cannot be used together" >expect.err && 1435 test_must_fail git format-patch -1 --stdout --subject-prefix="" -k >actual.out 2>actual.err && 1436 test_must_be_empty actual.out && 1437 test_cmp expect.err actual.err 1438' 1439 1440test_expect_success '--rfc and -k cannot be used together' ' 1441 echo "fatal: options '\''--subject-prefix/--rfc'\'' and '\''-k'\'' cannot be used together" >expect.err && 1442 test_must_fail git format-patch -1 --stdout --rfc -k >actual.out 2>actual.err && 1443 test_must_be_empty actual.out && 1444 test_cmp expect.err actual.err 1445' 1446 1447test_expect_success '--from=ident notices bogus ident' ' 1448 test_must_fail git format-patch -1 --stdout --from=foo >patch 1449' 1450 1451test_expect_success '--from=ident replaces author' ' 1452 git format-patch -1 --stdout --from="Me <me@example.com>" >patch && 1453 cat >expect <<-\EOF && 1454 From: Me <me@example.com> 1455 1456 From: A U Thor <author@example.com> 1457 1458 EOF 1459 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && 1460 test_cmp expect patch.head 1461' 1462 1463test_expect_success '--from uses committer ident' ' 1464 git format-patch -1 --stdout --from >patch && 1465 cat >expect <<-\EOF && 1466 From: C O Mitter <committer@example.com> 1467 1468 From: A U Thor <author@example.com> 1469 1470 EOF 1471 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && 1472 test_cmp expect patch.head 1473' 1474 1475test_expect_success '--from omits redundant in-body header' ' 1476 git format-patch -1 --stdout --from="A U Thor <author@example.com>" >patch && 1477 cat >expect <<-\EOF && 1478 From: A U Thor <author@example.com> 1479 1480 EOF 1481 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && 1482 test_cmp expect patch.head 1483' 1484 1485test_expect_success 'with --force-in-body-from, redundant in-body from is kept' ' 1486 git format-patch --force-in-body-from \ 1487 -1 --stdout --from="A U Thor <author@example.com>" >patch && 1488 cat >expect <<-\EOF && 1489 From: A U Thor <author@example.com> 1490 1491 From: A U Thor <author@example.com> 1492 1493 EOF 1494 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && 1495 test_cmp expect patch.head 1496' 1497 1498test_expect_success 'format.forceInBodyFrom, equivalent to --force-in-body-from' ' 1499 git -c format.forceInBodyFrom=yes format-patch \ 1500 -1 --stdout --from="A U Thor <author@example.com>" >patch && 1501 cat >expect <<-\EOF && 1502 From: A U Thor <author@example.com> 1503 1504 From: A U Thor <author@example.com> 1505 1506 EOF 1507 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && 1508 test_cmp expect patch.head 1509' 1510 1511test_expect_success 'format.forceInBodyFrom, equivalent to --force-in-body-from' ' 1512 git -c format.forceInBodyFrom=yes format-patch --no-force-in-body-from \ 1513 -1 --stdout --from="A U Thor <author@example.com>" >patch && 1514 cat >expect <<-\EOF && 1515 From: A U Thor <author@example.com> 1516 1517 EOF 1518 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && 1519 test_cmp expect patch.head 1520' 1521 1522test_expect_success 'in-body headers trigger content encoding' ' 1523 test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic && 1524 test_when_finished "git reset --hard HEAD^" && 1525 git format-patch -1 --stdout --from >patch && 1526 cat >expect <<-\EOF && 1527 From: C O Mitter <committer@example.com> 1528 Content-Type: text/plain; charset=UTF-8 1529 1530 From: éxötìc <author@example.com> 1531 1532 EOF 1533 sed -ne "/^From:/p; /^$/p; /^Content-Type/p; /^---$/q" patch >patch.head && 1534 test_cmp expect patch.head 1535' 1536 1537append_signoff() 1538{ 1539 C=$(git commit-tree HEAD^^{tree} -p HEAD) && 1540 git format-patch --stdout --signoff $C^..$C >append_signoff.patch && 1541 sed -n -e "1,/^---$/p" append_signoff.patch | 1542 grep -E -n "^Subject|Sign|^$" 1543} 1544 1545test_expect_success 'signoff: commit with no body' ' 1546 append_signoff </dev/null >actual && 1547 cat <<-\EOF | sed "s/EOL$//" >expect && 1548 4:Subject: [PATCH] EOL 1549 8: 1550 9:Signed-off-by: C O Mitter <committer@example.com> 1551 EOF 1552 test_cmp expect actual 1553' 1554 1555test_expect_success 'signoff: commit with only subject' ' 1556 echo subject | append_signoff >actual && 1557 cat >expect <<-\EOF && 1558 4:Subject: [PATCH] subject 1559 8: 1560 9:Signed-off-by: C O Mitter <committer@example.com> 1561 EOF 1562 test_cmp expect actual 1563' 1564 1565test_expect_success 'signoff: commit with only subject that does not end with NL' ' 1566 printf subject | append_signoff >actual && 1567 cat >expect <<-\EOF && 1568 4:Subject: [PATCH] subject 1569 8: 1570 9:Signed-off-by: C O Mitter <committer@example.com> 1571 EOF 1572 test_cmp expect actual 1573' 1574 1575test_expect_success 'signoff: no existing signoffs' ' 1576 append_signoff <<-\EOF >actual && 1577 subject 1578 1579 body 1580 EOF 1581 cat >expect <<-\EOF && 1582 4:Subject: [PATCH] subject 1583 8: 1584 10: 1585 11:Signed-off-by: C O Mitter <committer@example.com> 1586 EOF 1587 test_cmp expect actual 1588' 1589 1590test_expect_success 'signoff: no existing signoffs and no trailing NL' ' 1591 printf "subject\n\nbody" | append_signoff >actual && 1592 cat >expect <<-\EOF && 1593 4:Subject: [PATCH] subject 1594 8: 1595 10: 1596 11:Signed-off-by: C O Mitter <committer@example.com> 1597 EOF 1598 test_cmp expect actual 1599' 1600 1601test_expect_success 'signoff: some random signoff' ' 1602 append_signoff <<-\EOF >actual && 1603 subject 1604 1605 body 1606 1607 Signed-off-by: my@house 1608 EOF 1609 cat >expect <<-\EOF && 1610 4:Subject: [PATCH] subject 1611 8: 1612 10: 1613 11:Signed-off-by: my@house 1614 12:Signed-off-by: C O Mitter <committer@example.com> 1615 EOF 1616 test_cmp expect actual 1617' 1618 1619test_expect_success 'signoff: misc conforming footer elements' ' 1620 append_signoff <<-\EOF >actual && 1621 subject 1622 1623 body 1624 1625 Signed-off-by: my@house 1626 (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709) 1627 Tested-by: Some One <someone@example.com> 1628 Bug: 1234 1629 EOF 1630 cat >expect <<-\EOF && 1631 4:Subject: [PATCH] subject 1632 8: 1633 10: 1634 11:Signed-off-by: my@house 1635 15:Signed-off-by: C O Mitter <committer@example.com> 1636 EOF 1637 test_cmp expect actual 1638' 1639 1640test_expect_success 'signoff: some random signoff-alike' ' 1641 append_signoff <<-\EOF >actual && 1642 subject 1643 1644 body 1645 Fooled-by-me: my@house 1646 EOF 1647 cat >expect <<-\EOF && 1648 4:Subject: [PATCH] subject 1649 8: 1650 11: 1651 12:Signed-off-by: C O Mitter <committer@example.com> 1652 EOF 1653 test_cmp expect actual 1654' 1655 1656test_expect_success 'signoff: not really a signoff' ' 1657 append_signoff <<-\EOF >actual && 1658 subject 1659 1660 I want to mention about Signed-off-by: here. 1661 EOF 1662 cat >expect <<-\EOF && 1663 4:Subject: [PATCH] subject 1664 8: 1665 9:I want to mention about Signed-off-by: here. 1666 10: 1667 11:Signed-off-by: C O Mitter <committer@example.com> 1668 EOF 1669 test_cmp expect actual 1670' 1671 1672test_expect_success 'signoff: not really a signoff (2)' ' 1673 append_signoff <<-\EOF >actual && 1674 subject 1675 1676 My unfortunate 1677 Signed-off-by: example happens to be wrapped here. 1678 EOF 1679 cat >expect <<-\EOF && 1680 4:Subject: [PATCH] subject 1681 8: 1682 10:Signed-off-by: example happens to be wrapped here. 1683 11:Signed-off-by: C O Mitter <committer@example.com> 1684 EOF 1685 test_cmp expect actual 1686' 1687 1688test_expect_success 'signoff: valid S-o-b paragraph in the middle' ' 1689 append_signoff <<-\EOF >actual && 1690 subject 1691 1692 Signed-off-by: my@house 1693 Signed-off-by: your@house 1694 1695 A lot of houses. 1696 EOF 1697 cat >expect <<-\EOF && 1698 4:Subject: [PATCH] subject 1699 8: 1700 9:Signed-off-by: my@house 1701 10:Signed-off-by: your@house 1702 11: 1703 13: 1704 14:Signed-off-by: C O Mitter <committer@example.com> 1705 EOF 1706 test_cmp expect actual 1707' 1708 1709test_expect_success 'signoff: the same signoff at the end' ' 1710 append_signoff <<-\EOF >actual && 1711 subject 1712 1713 body 1714 1715 Signed-off-by: C O Mitter <committer@example.com> 1716 EOF 1717 cat >expect <<-\EOF && 1718 4:Subject: [PATCH] subject 1719 8: 1720 10: 1721 11:Signed-off-by: C O Mitter <committer@example.com> 1722 EOF 1723 test_cmp expect actual 1724' 1725 1726test_expect_success 'signoff: the same signoff at the end, no trailing NL' ' 1727 printf "subject\n\nSigned-off-by: C O Mitter <committer@example.com>" | 1728 append_signoff >actual && 1729 cat >expect <<-\EOF && 1730 4:Subject: [PATCH] subject 1731 8: 1732 9:Signed-off-by: C O Mitter <committer@example.com> 1733 EOF 1734 test_cmp expect actual 1735' 1736 1737test_expect_success 'signoff: the same signoff NOT at the end' ' 1738 append_signoff <<-\EOF >actual && 1739 subject 1740 1741 body 1742 1743 Signed-off-by: C O Mitter <committer@example.com> 1744 Signed-off-by: my@house 1745 EOF 1746 cat >expect <<-\EOF && 1747 4:Subject: [PATCH] subject 1748 8: 1749 10: 1750 11:Signed-off-by: C O Mitter <committer@example.com> 1751 12:Signed-off-by: my@house 1752 EOF 1753 test_cmp expect actual 1754' 1755 1756test_expect_success 'signoff: tolerate garbage in conforming footer' ' 1757 append_signoff <<-\EOF >actual && 1758 subject 1759 1760 body 1761 1762 Tested-by: my@house 1763 Some Trash 1764 Signed-off-by: C O Mitter <committer@example.com> 1765 EOF 1766 cat >expect <<-\EOF && 1767 4:Subject: [PATCH] subject 1768 8: 1769 10: 1770 13:Signed-off-by: C O Mitter <committer@example.com> 1771 EOF 1772 test_cmp expect actual 1773' 1774 1775test_expect_success 'signoff: respect trailer config' ' 1776 append_signoff <<-\EOF >actual && 1777 subject 1778 1779 Myfooter: x 1780 Some Trash 1781 EOF 1782 cat >expect <<-\EOF && 1783 4:Subject: [PATCH] subject 1784 8: 1785 11: 1786 12:Signed-off-by: C O Mitter <committer@example.com> 1787 EOF 1788 test_cmp expect actual && 1789 1790 test_config trailer.Myfooter.ifexists add && 1791 append_signoff <<-\EOF >actual && 1792 subject 1793 1794 Myfooter: x 1795 Some Trash 1796 EOF 1797 cat >expect <<-\EOF && 1798 4:Subject: [PATCH] subject 1799 8: 1800 11:Signed-off-by: C O Mitter <committer@example.com> 1801 EOF 1802 test_cmp expect actual 1803' 1804 1805test_expect_success 'signoff: footer begins with non-signoff without @ sign' ' 1806 append_signoff <<-\EOF >actual && 1807 subject 1808 1809 body 1810 1811 Reviewed-id: Noone 1812 Tested-by: my@house 1813 Change-id: Ideadbeef 1814 Signed-off-by: C O Mitter <committer@example.com> 1815 Bug: 1234 1816 EOF 1817 cat >expect <<-\EOF && 1818 4:Subject: [PATCH] subject 1819 8: 1820 10: 1821 14:Signed-off-by: C O Mitter <committer@example.com> 1822 EOF 1823 test_cmp expect actual 1824' 1825 1826test_expect_success 'format patch ignores color.ui' ' 1827 test_unconfig color.ui && 1828 git format-patch --stdout -1 >expect && 1829 test_config color.ui always && 1830 git format-patch --stdout -1 >actual && 1831 test_cmp expect actual 1832' 1833 1834test_expect_success 'format patch respects diff.relative' ' 1835 rm -rf subdir && 1836 mkdir subdir && 1837 echo other content >subdir/file2 && 1838 git add subdir/file2 && 1839 git commit -F msg && 1840 test_unconfig diff.relative && 1841 git format-patch --relative=subdir --stdout -1 >expect && 1842 test_config diff.relative true && 1843 git -C subdir format-patch --stdout -1 >actual && 1844 test_cmp expect actual 1845' 1846 1847test_expect_success 'cover letter with invalid --cover-from-description and config' ' 1848 test_config branch.rebuild-1.description "config subject 1849 1850body" && 1851 test_must_fail git format-patch --cover-letter --cover-from-description garbage main && 1852 test_config format.coverFromDescription garbage && 1853 test_must_fail git format-patch --cover-letter main 1854' 1855 1856test_expect_success 'cover letter with format.coverFromDescription = default' ' 1857 test_config branch.rebuild-1.description "config subject 1858 1859body" && 1860 test_config format.coverFromDescription default && 1861 git checkout rebuild-1 && 1862 git format-patch --stdout --cover-letter main >actual && 1863 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1864 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1865 grep "^config subject$" actual && 1866 grep "^body$" actual 1867' 1868 1869test_expect_success 'cover letter with --cover-from-description default' ' 1870 test_config branch.rebuild-1.description "config subject 1871 1872body" && 1873 git checkout rebuild-1 && 1874 git format-patch --stdout --cover-letter --cover-from-description default main >actual && 1875 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1876 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1877 grep "^config subject$" actual && 1878 grep "^body$" actual 1879' 1880 1881test_expect_success 'cover letter with format.coverFromDescription = none' ' 1882 test_config branch.rebuild-1.description "config subject 1883 1884body" && 1885 test_config format.coverFromDescription none && 1886 git checkout rebuild-1 && 1887 git format-patch --stdout --cover-letter main >actual && 1888 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1889 grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1890 ! grep "^config subject$" actual && 1891 ! grep "^body$" actual 1892' 1893 1894test_expect_success 'cover letter with --cover-from-description none' ' 1895 test_config branch.rebuild-1.description "config subject 1896 1897body" && 1898 git checkout rebuild-1 && 1899 git format-patch --stdout --cover-letter --cover-from-description none main >actual && 1900 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1901 grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1902 ! grep "^config subject$" actual && 1903 ! grep "^body$" actual 1904' 1905 1906test_expect_success 'cover letter with format.coverFromDescription = message' ' 1907 test_config branch.rebuild-1.description "config subject 1908 1909body" && 1910 test_config format.coverFromDescription message && 1911 git checkout rebuild-1 && 1912 git format-patch --stdout --cover-letter main >actual && 1913 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1914 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1915 grep "^config subject$" actual && 1916 grep "^body$" actual 1917' 1918 1919test_expect_success 'cover letter with --cover-from-description message' ' 1920 test_config branch.rebuild-1.description "config subject 1921 1922body" && 1923 git checkout rebuild-1 && 1924 git format-patch --stdout --cover-letter --cover-from-description message main >actual && 1925 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1926 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1927 grep "^config subject$" actual && 1928 grep "^body$" actual 1929' 1930 1931test_expect_success 'cover letter with format.coverFromDescription = subject' ' 1932 test_config branch.rebuild-1.description "config subject 1933 1934body" && 1935 test_config format.coverFromDescription subject && 1936 git checkout rebuild-1 && 1937 git format-patch --stdout --cover-letter main >actual && 1938 grep "^Subject: \[PATCH 0/2\] config subject$" actual && 1939 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1940 ! grep "^config subject$" actual && 1941 grep "^body$" actual 1942' 1943 1944test_expect_success 'cover letter with --cover-from-description subject' ' 1945 test_config branch.rebuild-1.description "config subject 1946 1947body" && 1948 git checkout rebuild-1 && 1949 git format-patch --stdout --cover-letter --cover-from-description subject main >actual && 1950 grep "^Subject: \[PATCH 0/2\] config subject$" actual && 1951 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1952 ! grep "^config subject$" actual && 1953 grep "^body$" actual 1954' 1955 1956test_expect_success 'cover letter with --cover-from-description subject (UTF-8 subject line)' ' 1957 test_config branch.rebuild-1.description "Café? 1958 1959body" && 1960 git checkout rebuild-1 && 1961 git format-patch --stdout --cover-letter --cover-from-description subject --encode-email-headers main >actual && 1962 grep "^Subject: \[PATCH 0/2\] =?UTF-8?q?Caf=C3=A9=3F?=$" actual && 1963 ! grep "Café" actual 1964' 1965 1966test_expect_success 'cover letter with format.coverFromDescription = auto (short subject line)' ' 1967 test_config branch.rebuild-1.description "config subject 1968 1969body" && 1970 test_config format.coverFromDescription auto && 1971 git checkout rebuild-1 && 1972 git format-patch --stdout --cover-letter main >actual && 1973 grep "^Subject: \[PATCH 0/2\] config subject$" actual && 1974 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1975 ! grep "^config subject$" actual && 1976 grep "^body$" actual 1977' 1978 1979test_expect_success 'cover letter with --cover-from-description auto (short subject line)' ' 1980 test_config branch.rebuild-1.description "config subject 1981 1982body" && 1983 git checkout rebuild-1 && 1984 git format-patch --stdout --cover-letter --cover-from-description auto main >actual && 1985 grep "^Subject: \[PATCH 0/2\] config subject$" actual && 1986 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 1987 ! grep "^config subject$" actual && 1988 grep "^body$" actual 1989' 1990 1991test_expect_success 'cover letter with format.coverFromDescription = auto (long subject line)' ' 1992 test_config branch.rebuild-1.description "this is a really long first line and it is over 100 characters long which is the threshold for long subjects 1993 1994body" && 1995 test_config format.coverFromDescription auto && 1996 git checkout rebuild-1 && 1997 git format-patch --stdout --cover-letter main >actual && 1998 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 1999 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 2000 grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && 2001 grep "^body$" actual 2002' 2003 2004test_expect_success 'cover letter with --cover-from-description auto (long subject line)' ' 2005 test_config branch.rebuild-1.description "this is a really long first line and it is over 100 characters long which is the threshold for long subjects 2006 2007body" && 2008 git checkout rebuild-1 && 2009 git format-patch --stdout --cover-letter --cover-from-description auto main >actual && 2010 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && 2011 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 2012 grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && 2013 grep "^body$" actual 2014' 2015 2016test_expect_success 'cover letter with command-line --cover-from-description overrides config' ' 2017 test_config branch.rebuild-1.description "config subject 2018 2019body" && 2020 test_config format.coverFromDescription none && 2021 git checkout rebuild-1 && 2022 git format-patch --stdout --cover-letter --cover-from-description subject main >actual && 2023 grep "^Subject: \[PATCH 0/2\] config subject$" actual && 2024 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && 2025 ! grep "^config subject$" actual && 2026 grep "^body$" actual 2027' 2028 2029test_expect_success 'cover letter using branch description (1)' ' 2030 git checkout rebuild-1 && 2031 test_config branch.rebuild-1.description hello && 2032 git format-patch --stdout --cover-letter main >actual && 2033 grep hello actual 2034' 2035 2036test_expect_success 'cover letter using branch description (2)' ' 2037 git checkout rebuild-1 && 2038 test_config branch.rebuild-1.description hello && 2039 git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual && 2040 grep hello actual 2041' 2042 2043test_expect_success 'cover letter using branch description (3)' ' 2044 git checkout rebuild-1 && 2045 test_config branch.rebuild-1.description hello && 2046 git format-patch --stdout --cover-letter ^main rebuild-1 >actual && 2047 grep hello actual 2048' 2049 2050test_expect_success 'cover letter using branch description (4)' ' 2051 git checkout rebuild-1 && 2052 test_config branch.rebuild-1.description hello && 2053 git format-patch --stdout --cover-letter main.. >actual && 2054 grep hello actual 2055' 2056 2057test_expect_success 'cover letter using branch description (5)' ' 2058 git checkout rebuild-1 && 2059 test_config branch.rebuild-1.description hello && 2060 git format-patch --stdout --cover-letter -2 HEAD >actual && 2061 grep hello actual 2062' 2063 2064test_expect_success 'cover letter using branch description (6)' ' 2065 git checkout rebuild-1 && 2066 test_config branch.rebuild-1.description hello && 2067 git format-patch --stdout --cover-letter -2 >actual && 2068 grep hello actual 2069' 2070 2071test_expect_success 'cover letter with --description-file' ' 2072 test_when_finished "rm -f description.txt" && 2073 cat >description.txt <<-\EOF && 2074 subject from file 2075 2076 body from file 2077 EOF 2078 git checkout rebuild-1 && 2079 git format-patch --stdout --cover-letter --cover-from-description auto \ 2080 --description-file description.txt main >actual && 2081 grep "^Subject: \[PATCH 0/2\] subject from file$" actual && 2082 grep "^body from file$" actual 2083' 2084 2085test_expect_success 'cover letter with nothing' ' 2086 git format-patch --stdout --cover-letter >actual && 2087 test_line_count = 0 actual 2088' 2089 2090test_expect_success 'cover letter auto' ' 2091 mkdir -p tmp && 2092 test_when_finished "rm -rf tmp; 2093 git config --unset format.coverletter" && 2094 2095 git config format.coverletter auto && 2096 git format-patch -o tmp -1 >list && 2097 test_line_count = 1 list && 2098 git format-patch -o tmp -2 >list && 2099 test_line_count = 3 list 2100' 2101 2102test_expect_success 'cover letter auto user override' ' 2103 mkdir -p tmp && 2104 test_when_finished "rm -rf tmp; 2105 git config --unset format.coverletter" && 2106 2107 git config format.coverletter auto && 2108 git format-patch -o tmp --cover-letter -1 >list && 2109 test_line_count = 2 list && 2110 git format-patch -o tmp --cover-letter -2 >list && 2111 test_line_count = 3 list && 2112 git format-patch -o tmp --no-cover-letter -1 >list && 2113 test_line_count = 1 list && 2114 git format-patch -o tmp --no-cover-letter -2 >list && 2115 test_line_count = 2 list 2116' 2117 2118test_expect_success 'format-patch --zero-commit' ' 2119 git format-patch --zero-commit --stdout v2..v1 >patch2 && 2120 grep "^From " patch2 | sort | uniq >actual && 2121 echo "From $ZERO_OID Mon Sep 17 00:00:00 2001" >expect && 2122 test_cmp expect actual 2123' 2124 2125test_expect_success 'From line has expected format' ' 2126 git format-patch --stdout v2..v1 >patch2 && 2127 grep "^From " patch2 >from && 2128 grep "^From $OID_REGEX Mon Sep 17 00:00:00 2001$" patch2 >filtered && 2129 test_cmp from filtered 2130' 2131 2132test_expect_success 'format-patch -o with no leading directories' ' 2133 rm -fr patches && 2134 git format-patch -o patches main..side && 2135 count=$(git rev-list --count main..side) && 2136 ls patches >list && 2137 test_line_count = $count list 2138' 2139 2140test_expect_success 'format-patch -o with leading existing directories' ' 2141 rm -rf existing-dir && 2142 mkdir existing-dir && 2143 git format-patch -o existing-dir/patches main..side && 2144 count=$(git rev-list --count main..side) && 2145 ls existing-dir/patches >list && 2146 test_line_count = $count list 2147' 2148 2149test_expect_success 'format-patch -o with leading non-existing directories' ' 2150 rm -rf non-existing-dir && 2151 git format-patch -o non-existing-dir/patches main..side && 2152 count=$(git rev-list --count main..side) && 2153 test_path_is_dir non-existing-dir && 2154 ls non-existing-dir/patches >list && 2155 test_line_count = $count list 2156' 2157 2158test_expect_success 'format-patch format.outputDirectory option' ' 2159 test_config format.outputDirectory patches && 2160 rm -fr patches && 2161 git format-patch main..side && 2162 count=$(git rev-list --count main..side) && 2163 ls patches >list && 2164 test_line_count = $count list 2165' 2166 2167test_expect_success 'format-patch -o overrides format.outputDirectory' ' 2168 test_config format.outputDirectory patches && 2169 rm -fr patches patchset && 2170 git format-patch main..side -o patchset && 2171 test_path_is_missing patches && 2172 test_path_is_dir patchset 2173' 2174 2175test_expect_success 'format-patch forbids multiple outputs' ' 2176 rm -fr outfile outdir && 2177 test_must_fail \ 2178 git format-patch --stdout --output-directory=outdir && 2179 test_must_fail \ 2180 git format-patch --stdout --output=outfile && 2181 test_must_fail \ 2182 git format-patch --output=outfile --output-directory=outdir 2183' 2184 2185test_expect_success 'configured outdir does not conflict with output options' ' 2186 rm -fr outfile outdir && 2187 test_config format.outputDirectory outdir && 2188 git format-patch --stdout && 2189 test_path_is_missing outdir && 2190 git format-patch --output=outfile && 2191 test_path_is_missing outdir 2192' 2193 2194test_expect_success 'format-patch --output' ' 2195 rm -fr outfile && 2196 git format-patch -3 --stdout HEAD >expect && 2197 git format-patch -3 --output=outfile HEAD && 2198 test_cmp expect outfile 2199' 2200 2201test_expect_success 'format-patch --cover-letter --output' ' 2202 rm -fr outfile && 2203 git format-patch --cover-letter -3 --stdout HEAD >expect && 2204 git format-patch --cover-letter -3 --output=outfile HEAD && 2205 test_cmp expect outfile 2206' 2207 2208test_expect_success 'format-patch --base' ' 2209 git checkout patchid && 2210 2211 git format-patch --stdout --base=HEAD~3 -1 >patch && 2212 tail -n 7 patch >actual1 && 2213 2214 git format-patch --stdout --base=HEAD~3 HEAD~.. >patch && 2215 tail -n 7 patch >actual2 && 2216 2217 echo >expect && 2218 git rev-parse HEAD~3 >commit-id-base && 2219 echo "base-commit: $(cat commit-id-base)" >>expect && 2220 2221 git show --patch HEAD~2 >patch && 2222 git patch-id --stable <patch >patch.id.raw && 2223 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>expect && 2224 2225 git show --patch HEAD~1 >patch && 2226 git patch-id --stable <patch >patch.id.raw && 2227 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>expect && 2228 2229 signature >>expect && 2230 test_cmp expect actual1 && 2231 test_cmp expect actual2 && 2232 2233 echo >fail && 2234 echo "base-commit: $(cat commit-id-base)" >>fail && 2235 2236 git show --patch HEAD~2 >patch && 2237 git patch-id --unstable <patch >patch.id.raw && 2238 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>fail && 2239 2240 git show --patch HEAD~1 >patch && 2241 git patch-id --unstable <patch >patch.id.raw && 2242 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>fail && 2243 2244 signature >>fail && 2245 ! test_cmp fail actual1 && 2246 ! test_cmp fail actual2 2247' 2248 2249test_expect_success 'format-patch --base errors out when base commit is in revision list' ' 2250 test_must_fail git format-patch --base=HEAD -2 && 2251 test_must_fail git format-patch --base=HEAD~1 -2 && 2252 git format-patch --stdout --base=HEAD~2 -2 >patch && 2253 grep "^base-commit:" patch >actual && 2254 git rev-parse HEAD~2 >commit-id-base && 2255 echo "base-commit: $(cat commit-id-base)" >expect && 2256 test_cmp expect actual 2257' 2258 2259test_expect_success 'format-patch --base errors out when base commit is not ancestor of revision list' ' 2260 # For history as below: 2261 # 2262 # ---Q---P---Z---Y---*---X 2263 # \ / 2264 # ------------W 2265 # 2266 # If "format-patch Z..X" is given, P and Z can not be specified as the base commit 2267 git checkout -b topic1 main && 2268 git rev-parse HEAD >commit-id-base && 2269 test_commit P && 2270 git rev-parse HEAD >commit-id-P && 2271 test_commit Z && 2272 git rev-parse HEAD >commit-id-Z && 2273 test_commit Y && 2274 git checkout -b topic2 main && 2275 test_commit W && 2276 git merge topic1 && 2277 test_commit X && 2278 test_must_fail git format-patch --base=$(cat commit-id-P) -3 && 2279 test_must_fail git format-patch --base=$(cat commit-id-Z) -3 && 2280 git format-patch --stdout --base=$(cat commit-id-base) -3 >patch && 2281 grep "^base-commit:" patch >actual && 2282 echo "base-commit: $(cat commit-id-base)" >expect && 2283 test_cmp expect actual 2284' 2285 2286test_expect_success 'format-patch --base=auto' ' 2287 git checkout -b upstream main && 2288 git checkout -b local upstream && 2289 git branch --set-upstream-to=upstream && 2290 test_commit N1 && 2291 test_commit N2 && 2292 git format-patch --stdout --base=auto -2 >patch && 2293 grep "^base-commit:" patch >actual && 2294 git rev-parse upstream >commit-id-base && 2295 echo "base-commit: $(cat commit-id-base)" >expect && 2296 test_cmp expect actual 2297' 2298 2299test_expect_success 'format-patch errors out when history involves criss-cross' ' 2300 # setup criss-cross history 2301 # 2302 # B---M1---D 2303 # / \ / 2304 # A X 2305 # \ / \ 2306 # C---M2---E 2307 # 2308 git checkout main && 2309 test_commit A && 2310 git checkout -b xb main && 2311 test_commit B && 2312 git checkout -b xc main && 2313 test_commit C && 2314 git checkout -b xbc xb -- && 2315 git merge xc && 2316 git checkout -b xcb xc -- && 2317 git branch --set-upstream-to=xbc && 2318 git merge xb && 2319 git checkout xbc && 2320 test_commit D && 2321 git checkout xcb && 2322 test_commit E && 2323 test_must_fail git format-patch --base=auto -1 2324' 2325 2326test_expect_success 'format-patch format.useAutoBase whenAble history involves criss-cross' ' 2327 test_config format.useAutoBase whenAble && 2328 git format-patch -1 >patch && 2329 ! grep "^base-commit:" patch 2330' 2331 2332test_expect_success 'format-patch format.useAutoBase option' ' 2333 git checkout local && 2334 test_config format.useAutoBase true && 2335 git format-patch --stdout -1 >patch && 2336 grep "^base-commit:" patch >actual && 2337 git rev-parse upstream >commit-id-base && 2338 echo "base-commit: $(cat commit-id-base)" >expect && 2339 test_cmp expect actual 2340' 2341 2342test_expect_success 'format-patch format.useAutoBase option with whenAble' ' 2343 git checkout local && 2344 test_config format.useAutoBase whenAble && 2345 git format-patch --stdout -1 >patch && 2346 grep "^base-commit:" patch >actual && 2347 git rev-parse upstream >commit-id-base && 2348 echo "base-commit: $(cat commit-id-base)" >expect && 2349 test_cmp expect actual 2350' 2351 2352test_expect_success 'format-patch --base overrides format.useAutoBase' ' 2353 test_config format.useAutoBase true && 2354 git format-patch --stdout --base=HEAD~1 -1 >patch && 2355 grep "^base-commit:" patch >actual && 2356 git rev-parse HEAD~1 >commit-id-base && 2357 echo "base-commit: $(cat commit-id-base)" >expect && 2358 test_cmp expect actual 2359' 2360 2361test_expect_success 'format-patch --no-base overrides format.useAutoBase' ' 2362 test_config format.useAutoBase true && 2363 git format-patch --stdout --no-base -1 >patch && 2364 ! grep "^base-commit:" patch 2365' 2366 2367test_expect_success 'format-patch --no-base overrides format.useAutoBase whenAble' ' 2368 test_config format.useAutoBase whenAble && 2369 git format-patch --stdout --no-base -1 >patch && 2370 ! grep "^base-commit:" patch 2371' 2372 2373test_expect_success 'format-patch --base with --attach' ' 2374 git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch && 2375 sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \ 2376 patch >actual && 2377 test_write_lines 1 2 >expect && 2378 test_cmp expect actual 2379' 2380test_expect_success 'format-patch --attach cover-letter only is non-multipart' ' 2381 test_when_finished "rm -fr patches" && 2382 git format-patch -o patches --cover-letter --attach=mimemime --base=HEAD~ -1 && 2383 ! grep -E "^--+mimemime" patches/0000*.patch && 2384 grep -E "^--+mimemime$" patches/0001*.patch >output && 2385 test_line_count = 2 output && 2386 grep -E "^--+mimemime--$" patches/0001*.patch >output && 2387 test_line_count = 1 output 2388' 2389 2390test_expect_success 'format-patch with format.attach' ' 2391 test_when_finished "rm -fr patches" && 2392 separator=attachment-separator && 2393 test_config format.attach "$separator" && 2394 filename=$(git format-patch -o patches -1) && 2395 grep "^Content-Type: multipart/.*$separator" "$filename" 2396' 2397 2398test_expect_success 'format-patch with format.attach=disabled' ' 2399 test_when_finished "rm -fr patches" && 2400 separator=attachment-separator && 2401 test_config_global format.attach "$separator" && 2402 test_config format.attach "" && 2403 filename=$(git format-patch -o patches -1) && 2404 # The output should not even declare content type for text/plain. 2405 ! grep "^Content-Type: multipart/" "$filename" 2406' 2407 2408test_expect_success '-c format.mboxrd format-patch' ' 2409 sp=" " && 2410 cat >msg <<-INPUT_END && 2411 mboxrd should escape the body 2412 2413 From could trip up a loose mbox parser 2414 >From extra escape for reversibility 2415 >>From extra escape for reversibility 2 2416 from lower case not escaped 2417 Fromm bad speling not escaped 2418 From with leading space not escaped 2419 2420 F 2421 From 2422 From$sp 2423 From $sp 2424 From $sp 2425 INPUT_END 2426 2427 cat >expect <<-INPUT_END && 2428 >From could trip up a loose mbox parser 2429 >>From extra escape for reversibility 2430 >>>From extra escape for reversibility 2 2431 from lower case not escaped 2432 Fromm bad speling not escaped 2433 From with leading space not escaped 2434 2435 F 2436 From 2437 From 2438 From 2439 From 2440 INPUT_END 2441 2442 C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) && 2443 git -c format.mboxrd format-patch --stdout -1 $C~1..$C >patch && 2444 git format-patch --pretty=mboxrd --stdout -1 $C~1..$C >compat && 2445 test_cmp patch compat && 2446 git grep -h --no-index -A11 \ 2447 "^>From could trip up a loose mbox parser" patch >actual && 2448 test_cmp expect actual 2449' 2450 2451test_expect_success 'interdiff: setup' ' 2452 git checkout -b boop main && 2453 test_commit fnorp blorp && 2454 test_commit fleep blorp 2455' 2456 2457test_expect_success 'interdiff: cover-letter' ' 2458 sed "y/q/ /" >expect <<-\EOF && 2459 +fleep 2460 --q 2461 EOF 2462 git format-patch --cover-letter --interdiff=boop~2 -1 boop && 2463 test_grep "^Interdiff:$" 0000-cover-letter.patch && 2464 test_grep ! "^Interdiff:$" 0001-fleep.patch && 2465 sed "1,/^@@ /d; /^-- $/q" 0000-cover-letter.patch >actual && 2466 test_cmp expect actual 2467' 2468 2469test_expect_success 'interdiff: reroll-count' ' 2470 git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && 2471 test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch 2472' 2473 2474test_expect_success 'interdiff: reroll-count with a non-integer' ' 2475 git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop && 2476 test_grep "^Interdiff:$" v2.2-0000-cover-letter.patch 2477' 2478 2479test_expect_success 'interdiff: reroll-count with a integer' ' 2480 git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && 2481 test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch 2482' 2483 2484test_expect_success 'interdiff: solo-patch' ' 2485 git format-patch --interdiff=boop~2 -1 boop && 2486 2487 # remove up to the last "patch" output line, 2488 # and remove everything below the signature mark. 2489 sed -e "1,/^+fleep\$/d" -e "/^-- /,\$d" 0001-fleep.patch >actual && 2490 2491 # fabricate Interdiff output. 2492 git diff boop~2 boop >inter && 2493 { 2494 echo && 2495 echo "Interdiff:" && 2496 sed -e "s/^/ /" inter 2497 } >expect && 2498 test_cmp expect actual 2499' 2500 2501test_expect_success 'range-diff: solo-patch' ' 2502 git format-patch --creation-factor=999 \ 2503 --range-diff=boop~2..boop~1 -1 boop && 2504 2505 # remove up to the last "patch" output line, 2506 # and remove everything below the signature mark. 2507 sed -e "1,/^+fleep\$/d" -e "/^-- /,\$d" 0001-fleep.patch >actual && 2508 2509 # fabricate range-diff output. 2510 { 2511 echo && 2512 echo "Range-diff:" && 2513 git range-diff --creation-factor=999 \ 2514 boop~2..boop~1 boop~1..boop 2515 } >expect && 2516 test_cmp expect actual 2517' 2518 2519test_expect_success 'interdiff: multi-patch, implicit --cover-letter' ' 2520 test_when_finished "rm -f v23-0*.patch" && 2521 git format-patch --interdiff=boop~2 -2 -v23 && 2522 test_grep "^Interdiff against v22:$" v23-0000-cover-letter.patch && 2523 test_cmp expect actual 2524' 2525 2526test_expect_success 'interdiff: explicit --no-cover-letter defeats implied --cover-letter' ' 2527 test_when_finished "rm -f v23-0*.patch" && 2528 test_must_fail git format-patch --no-cover-letter \ 2529 --interdiff=boop~2 -2 -v23 && 2530 test_must_fail git -c format.coverLetter=no format-patch \ 2531 --interdiff=boop~2 -2 -v23 2532' 2533 2534test_expect_success 'format-patch does not respect diff.noprefix' ' 2535 git -c diff.noprefix format-patch -1 --stdout >actual && 2536 grep "^--- a/blorp" actual 2537' 2538 2539test_expect_success 'format-patch respects format.noprefix' ' 2540 git -c format.noprefix format-patch -1 --stdout >actual && 2541 grep "^--- blorp" actual 2542' 2543 2544test_expect_success 'format-patch --default-prefix overrides format.noprefix' ' 2545 git -c format.noprefix \ 2546 format-patch -1 --default-prefix --stdout >actual && 2547 grep "^--- a/blorp" actual 2548' 2549 2550test_done