t / t4015-diff-whitespace.shon commit tests: use 'test_must_be_empty' instead of '! test -s' (ec10b01)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Johannes E. Schindelin
   4#
   5
   6test_description='Test special whitespace in diff engine.
   7
   8'
   9. ./test-lib.sh
  10. "$TEST_DIRECTORY"/diff-lib.sh
  11
  12test_expect_success "Ray Lehtiniemi's example" '
  13        cat <<-\EOF >x &&
  14        do {
  15           nothing;
  16        } while (0);
  17        EOF
  18        git update-index --add x &&
  19
  20        cat <<-\EOF >x &&
  21        do
  22        {
  23           nothing;
  24        }
  25        while (0);
  26        EOF
  27
  28        cat <<-\EOF >expect &&
  29        diff --git a/x b/x
  30        index adf3937..6edc172 100644
  31        --- a/x
  32        +++ b/x
  33        @@ -1,3 +1,5 @@
  34        -do {
  35        +do
  36        +{
  37            nothing;
  38        -} while (0);
  39        +}
  40        +while (0);
  41        EOF
  42
  43        git diff >out &&
  44        test_cmp expect out &&
  45
  46        git diff -w >out &&
  47        test_cmp expect out &&
  48
  49        git diff -b >out &&
  50        test_cmp expect out
  51'
  52
  53test_expect_success 'another test, without options' '
  54        tr Q "\015" <<-\EOF >x &&
  55        whitespace at beginning
  56        whitespace change
  57        whitespace in the middle
  58        whitespace at end
  59        unchanged line
  60        CR at endQ
  61        EOF
  62
  63        git update-index x &&
  64
  65        tr "_" " " <<-\EOF >x &&
  66        _       whitespace at beginning
  67        whitespace       change
  68        white space in the middle
  69        whitespace at end__
  70        unchanged line
  71        CR at end
  72        EOF
  73
  74        tr "Q_" "\015 " <<-\EOF >expect &&
  75        diff --git a/x b/x
  76        index d99af23..22d9f73 100644
  77        --- a/x
  78        +++ b/x
  79        @@ -1,6 +1,6 @@
  80        -whitespace at beginning
  81        -whitespace change
  82        -whitespace in the middle
  83        -whitespace at end
  84        +       whitespace at beginning
  85        +whitespace      change
  86        +white space in the middle
  87        +whitespace at end__
  88         unchanged line
  89        -CR at endQ
  90        +CR at end
  91        EOF
  92
  93        git diff >out &&
  94        test_cmp expect out &&
  95
  96        git diff -w >out &&
  97        test_must_be_empty out &&
  98
  99        git diff -w -b >out &&
 100        test_must_be_empty out &&
 101
 102        git diff -w --ignore-space-at-eol >out &&
 103        test_must_be_empty out &&
 104
 105        git diff -w -b --ignore-space-at-eol >out &&
 106        test_must_be_empty out &&
 107
 108        git diff -w --ignore-cr-at-eol >out &&
 109        test_must_be_empty out &&
 110
 111        tr "Q_" "\015 " <<-\EOF >expect &&
 112        diff --git a/x b/x
 113        index d99af23..22d9f73 100644
 114        --- a/x
 115        +++ b/x
 116        @@ -1,6 +1,6 @@
 117        -whitespace at beginning
 118        +_      whitespace at beginning
 119         whitespace      change
 120        -whitespace in the middle
 121        +white space in the middle
 122         whitespace at end__
 123         unchanged line
 124         CR at end
 125        EOF
 126        git diff -b >out &&
 127        test_cmp expect out &&
 128
 129        git diff -b --ignore-space-at-eol >out &&
 130        test_cmp expect out &&
 131
 132        git diff -b --ignore-cr-at-eol >out &&
 133        test_cmp expect out &&
 134
 135        tr "Q_" "\015 " <<-\EOF >expect &&
 136        diff --git a/x b/x
 137        index d99af23..22d9f73 100644
 138        --- a/x
 139        +++ b/x
 140        @@ -1,6 +1,6 @@
 141        -whitespace at beginning
 142        -whitespace change
 143        -whitespace in the middle
 144        +_      whitespace at beginning
 145        +whitespace      change
 146        +white space in the middle
 147         whitespace at end__
 148         unchanged line
 149         CR at end
 150        EOF
 151        git diff --ignore-space-at-eol >out &&
 152        test_cmp expect out &&
 153
 154        git diff --ignore-space-at-eol --ignore-cr-at-eol >out &&
 155        test_cmp expect out &&
 156
 157        tr "Q_" "\015 " <<-\EOF >expect &&
 158        diff --git a/x b/x
 159        index_d99af23..22d9f73 100644
 160        --- a/x
 161        +++ b/x
 162        @@ -1,6 +1,6 @@
 163        -whitespace at beginning
 164        -whitespace change
 165        -whitespace in the middle
 166        -whitespace at end
 167        +_      whitespace at beginning
 168        +whitespace_    _change
 169        +white space in the middle
 170        +whitespace at end__
 171         unchanged line
 172         CR at end
 173        EOF
 174        git diff --ignore-cr-at-eol >out &&
 175        test_cmp expect out
 176'
 177
 178test_expect_success 'ignore-blank-lines: only new lines' '
 179        test_seq 5 >x &&
 180        git update-index x &&
 181        test_seq 5 | sed "/3/i\\
 182" >x &&
 183        git diff --ignore-blank-lines >out &&
 184        test_must_be_empty out
 185'
 186
 187test_expect_success 'ignore-blank-lines: only new lines with space' '
 188        test_seq 5 >x &&
 189        git update-index x &&
 190        test_seq 5 | sed "/3/i\\
 191 " >x &&
 192        git diff -w --ignore-blank-lines >out &&
 193        test_must_be_empty out
 194'
 195
 196test_expect_success 'ignore-blank-lines: after change' '
 197        cat <<-\EOF >x &&
 198        1
 199        2
 200
 201        3
 202        4
 203        5
 204
 205        6
 206        7
 207        EOF
 208        git update-index x &&
 209        cat <<-\EOF >x &&
 210        change
 211
 212        1
 213        2
 214        3
 215        4
 216        5
 217        6
 218
 219        7
 220        EOF
 221        git diff --inter-hunk-context=100 --ignore-blank-lines >out.tmp &&
 222        cat <<-\EOF >expected &&
 223        diff --git a/x b/x
 224        --- a/x
 225        +++ b/x
 226        @@ -1,6 +1,7 @@
 227        +change
 228        +
 229         1
 230         2
 231        -
 232         3
 233         4
 234         5
 235        EOF
 236        compare_diff_patch expected out.tmp
 237'
 238
 239test_expect_success 'ignore-blank-lines: before change' '
 240        cat <<-\EOF >x &&
 241        1
 242        2
 243
 244        3
 245        4
 246        5
 247        6
 248        7
 249        EOF
 250        git update-index x &&
 251        cat <<-\EOF >x &&
 252
 253        1
 254        2
 255        3
 256        4
 257        5
 258
 259        6
 260        7
 261        change
 262        EOF
 263        git diff --inter-hunk-context=100 --ignore-blank-lines >out.tmp &&
 264        cat <<-\EOF >expected &&
 265        diff --git a/x b/x
 266        --- a/x
 267        +++ b/x
 268        @@ -4,5 +4,7 @@
 269         3
 270         4
 271         5
 272        +
 273         6
 274         7
 275        +change
 276        EOF
 277        compare_diff_patch expected out.tmp
 278'
 279
 280test_expect_success 'ignore-blank-lines: between changes' '
 281        cat <<-\EOF >x &&
 282        1
 283        2
 284        3
 285        4
 286        5
 287
 288
 289        6
 290        7
 291        8
 292        9
 293        10
 294        EOF
 295        git update-index x &&
 296        cat <<-\EOF >x &&
 297        change
 298        1
 299        2
 300
 301        3
 302        4
 303        5
 304        6
 305        7
 306        8
 307
 308        9
 309        10
 310        change
 311        EOF
 312        git diff --ignore-blank-lines >out.tmp &&
 313        cat <<-\EOF >expected &&
 314        diff --git a/x b/x
 315        --- a/x
 316        +++ b/x
 317        @@ -1,5 +1,7 @@
 318        +change
 319         1
 320         2
 321        +
 322         3
 323         4
 324         5
 325        @@ -8,5 +8,7 @@
 326         6
 327         7
 328         8
 329        +
 330         9
 331         10
 332        +change
 333        EOF
 334        compare_diff_patch expected out.tmp
 335'
 336
 337test_expect_success 'ignore-blank-lines: between changes (with interhunkctx)' '
 338        test_seq 10 >x &&
 339        git update-index x &&
 340        cat <<-\EOF >x &&
 341        change
 342        1
 343        2
 344
 345        3
 346        4
 347        5
 348
 349        6
 350        7
 351        8
 352        9
 353
 354        10
 355        change
 356        EOF
 357        git diff --inter-hunk-context=2 --ignore-blank-lines >out.tmp &&
 358        cat <<-\EOF >expected &&
 359        diff --git a/x b/x
 360        --- a/x
 361        +++ b/x
 362        @@ -1,10 +1,15 @@
 363        +change
 364         1
 365         2
 366        +
 367         3
 368         4
 369         5
 370        +
 371         6
 372         7
 373         8
 374         9
 375        +
 376         10
 377        +change
 378        EOF
 379        compare_diff_patch expected out.tmp
 380'
 381
 382test_expect_success 'ignore-blank-lines: scattered spaces' '
 383        test_seq 10 >x &&
 384        git update-index x &&
 385        cat <<-\EOF >x &&
 386        change
 387        1
 388        2
 389        3
 390
 391        4
 392
 393        5
 394
 395        6
 396
 397
 398        7
 399
 400        8
 401        9
 402        10
 403        change
 404        EOF
 405        git diff --inter-hunk-context=4 --ignore-blank-lines >out.tmp &&
 406        cat <<-\EOF >expected &&
 407        diff --git a/x b/x
 408        --- a/x
 409        +++ b/x
 410        @@ -1,3 +1,4 @@
 411        +change
 412         1
 413         2
 414         3
 415        @@ -8,3 +15,4 @@
 416         8
 417         9
 418         10
 419        +change
 420        EOF
 421        compare_diff_patch expected out.tmp
 422'
 423
 424test_expect_success 'ignore-blank-lines: spaces coalesce' '
 425        test_seq 6 >x &&
 426        git update-index x &&
 427        cat <<-\EOF >x &&
 428        change
 429        1
 430        2
 431        3
 432
 433        4
 434
 435        5
 436
 437        6
 438        change
 439        EOF
 440        git diff --inter-hunk-context=4 --ignore-blank-lines >out.tmp &&
 441        cat <<-\EOF >expected &&
 442        diff --git a/x b/x
 443        --- a/x
 444        +++ b/x
 445        @@ -1,6 +1,11 @@
 446        +change
 447         1
 448         2
 449         3
 450        +
 451         4
 452        +
 453         5
 454        +
 455         6
 456        +change
 457        EOF
 458        compare_diff_patch expected out.tmp
 459'
 460
 461test_expect_success 'ignore-blank-lines: mix changes and blank lines' '
 462        test_seq 16 >x &&
 463        git update-index x &&
 464        cat <<-\EOF >x &&
 465        change
 466        1
 467        2
 468
 469        3
 470        4
 471        5
 472        change
 473        6
 474        7
 475        8
 476
 477        9
 478        10
 479        11
 480        change
 481        12
 482        13
 483        14
 484
 485        15
 486        16
 487        change
 488        EOF
 489        git diff --ignore-blank-lines >out.tmp &&
 490        cat <<-\EOF >expected &&
 491        diff --git a/x b/x
 492        --- a/x
 493        +++ b/x
 494        @@ -1,8 +1,11 @@
 495        +change
 496         1
 497         2
 498        +
 499         3
 500         4
 501         5
 502        +change
 503         6
 504         7
 505         8
 506        @@ -9,8 +13,11 @@
 507         9
 508         10
 509         11
 510        +change
 511         12
 512         13
 513         14
 514        +
 515         15
 516         16
 517        +change
 518        EOF
 519        compare_diff_patch expected out.tmp
 520'
 521
 522test_expect_success 'check mixed spaces and tabs in indent' '
 523        # This is indented with SP HT SP.
 524        echo "   foo();" >x &&
 525        git diff --check | grep "space before tab in indent"
 526'
 527
 528test_expect_success 'check mixed tabs and spaces in indent' '
 529        # This is indented with HT SP HT.
 530        echo "          foo();" >x &&
 531        git diff --check | grep "space before tab in indent"
 532'
 533
 534test_expect_success 'check with no whitespace errors' '
 535        git commit -m "snapshot" &&
 536        echo "foo();" >x &&
 537        git diff --check
 538'
 539
 540test_expect_success 'check with trailing whitespace' '
 541        echo "foo(); " >x &&
 542        test_must_fail git diff --check
 543'
 544
 545test_expect_success 'check with space before tab in indent' '
 546        # indent has space followed by hard tab
 547        echo "  foo();" >x &&
 548        test_must_fail git diff --check
 549'
 550
 551test_expect_success '--check and --exit-code are not exclusive' '
 552        git checkout x &&
 553        git diff --check --exit-code
 554'
 555
 556test_expect_success '--check and --quiet are not exclusive' '
 557        git diff --check --quiet
 558'
 559
 560test_expect_success 'check staged with no whitespace errors' '
 561        echo "foo();" >x &&
 562        git add x &&
 563        git diff --cached --check
 564'
 565
 566test_expect_success 'check staged with trailing whitespace' '
 567        echo "foo(); " >x &&
 568        git add x &&
 569        test_must_fail git diff --cached --check
 570'
 571
 572test_expect_success 'check staged with space before tab in indent' '
 573        # indent has space followed by hard tab
 574        echo "  foo();" >x &&
 575        git add x &&
 576        test_must_fail git diff --cached --check
 577'
 578
 579test_expect_success 'check with no whitespace errors (diff-index)' '
 580        echo "foo();" >x &&
 581        git add x &&
 582        git diff-index --check HEAD
 583'
 584
 585test_expect_success 'check with trailing whitespace (diff-index)' '
 586        echo "foo(); " >x &&
 587        git add x &&
 588        test_must_fail git diff-index --check HEAD
 589'
 590
 591test_expect_success 'check with space before tab in indent (diff-index)' '
 592        # indent has space followed by hard tab
 593        echo "  foo();" >x &&
 594        git add x &&
 595        test_must_fail git diff-index --check HEAD
 596'
 597
 598test_expect_success 'check staged with no whitespace errors (diff-index)' '
 599        echo "foo();" >x &&
 600        git add x &&
 601        git diff-index --cached --check HEAD
 602'
 603
 604test_expect_success 'check staged with trailing whitespace (diff-index)' '
 605        echo "foo(); " >x &&
 606        git add x &&
 607        test_must_fail git diff-index --cached --check HEAD
 608'
 609
 610test_expect_success 'check staged with space before tab in indent (diff-index)' '
 611        # indent has space followed by hard tab
 612        echo "  foo();" >x &&
 613        git add x &&
 614        test_must_fail git diff-index --cached --check HEAD
 615'
 616
 617test_expect_success 'check with no whitespace errors (diff-tree)' '
 618        echo "foo();" >x &&
 619        git commit -m "new commit" x &&
 620        git diff-tree --check HEAD^ HEAD
 621'
 622
 623test_expect_success 'check with trailing whitespace (diff-tree)' '
 624        echo "foo(); " >x &&
 625        git commit -m "another commit" x &&
 626        test_must_fail git diff-tree --check HEAD^ HEAD
 627'
 628
 629test_expect_success 'check with space before tab in indent (diff-tree)' '
 630        # indent has space followed by hard tab
 631        echo "  foo();" >x &&
 632        git commit -m "yet another" x &&
 633        test_must_fail git diff-tree --check HEAD^ HEAD
 634'
 635
 636test_expect_success 'check with ignored trailing whitespace attr (diff-tree)' '
 637        test_when_finished "git reset --hard HEAD^" &&
 638
 639        # create a whitespace error that should be ignored
 640        echo "* -whitespace" >.gitattributes &&
 641        git add .gitattributes &&
 642        echo "foo(); " >x &&
 643        git add x &&
 644        git commit -m "add trailing space" &&
 645
 646        # with a worktree diff-tree ignores the whitespace error
 647        git diff-tree --root --check HEAD &&
 648
 649        # without a worktree diff-tree still ignores the whitespace error
 650        git -C .git diff-tree --root --check HEAD
 651'
 652
 653test_expect_success 'check trailing whitespace (trailing-space: off)' '
 654        git config core.whitespace "-trailing-space" &&
 655        echo "foo ();   " >x &&
 656        git diff --check
 657'
 658
 659test_expect_success 'check trailing whitespace (trailing-space: on)' '
 660        git config core.whitespace "trailing-space" &&
 661        echo "foo ();   " >x &&
 662        test_must_fail git diff --check
 663'
 664
 665test_expect_success 'check space before tab in indent (space-before-tab: off)' '
 666        # indent contains space followed by HT
 667        git config core.whitespace "-space-before-tab" &&
 668        echo "  foo ();" >x &&
 669        git diff --check
 670'
 671
 672test_expect_success 'check space before tab in indent (space-before-tab: on)' '
 673        # indent contains space followed by HT
 674        git config core.whitespace "space-before-tab" &&
 675        echo "  foo ();   " >x &&
 676        test_must_fail git diff --check
 677'
 678
 679test_expect_success 'check spaces as indentation (indent-with-non-tab: off)' '
 680        git config core.whitespace "-indent-with-non-tab" &&
 681        echo "        foo ();" >x &&
 682        git diff --check
 683'
 684
 685test_expect_success 'check spaces as indentation (indent-with-non-tab: on)' '
 686        git config core.whitespace "indent-with-non-tab" &&
 687        echo "        foo ();" >x &&
 688        test_must_fail git diff --check
 689'
 690
 691test_expect_success 'ditto, but tabwidth=9' '
 692        git config core.whitespace "indent-with-non-tab,tabwidth=9" &&
 693        git diff --check
 694'
 695
 696test_expect_success 'check tabs and spaces as indentation (indent-with-non-tab: on)' '
 697        git config core.whitespace "indent-with-non-tab" &&
 698        echo "                  foo ();" >x &&
 699        test_must_fail git diff --check
 700'
 701
 702test_expect_success 'ditto, but tabwidth=10' '
 703        git config core.whitespace "indent-with-non-tab,tabwidth=10" &&
 704        test_must_fail git diff --check
 705'
 706
 707test_expect_success 'ditto, but tabwidth=20' '
 708        git config core.whitespace "indent-with-non-tab,tabwidth=20" &&
 709        git diff --check
 710'
 711
 712test_expect_success 'check tabs as indentation (tab-in-indent: off)' '
 713        git config core.whitespace "-tab-in-indent" &&
 714        echo "  foo ();" >x &&
 715        git diff --check
 716'
 717
 718test_expect_success 'check tabs as indentation (tab-in-indent: on)' '
 719        git config core.whitespace "tab-in-indent" &&
 720        echo "  foo ();" >x &&
 721        test_must_fail git diff --check
 722'
 723
 724test_expect_success 'check tabs and spaces as indentation (tab-in-indent: on)' '
 725        git config core.whitespace "tab-in-indent" &&
 726        echo "                  foo ();" >x &&
 727        test_must_fail git diff --check
 728'
 729
 730test_expect_success 'ditto, but tabwidth=1 (must be irrelevant)' '
 731        git config core.whitespace "tab-in-indent,tabwidth=1" &&
 732        test_must_fail git diff --check
 733'
 734
 735test_expect_success 'check tab-in-indent and indent-with-non-tab conflict' '
 736        git config core.whitespace "tab-in-indent,indent-with-non-tab" &&
 737        echo "foo ();" >x &&
 738        test_must_fail git diff --check
 739'
 740
 741test_expect_success 'check tab-in-indent excluded from wildcard whitespace attribute' '
 742        git config --unset core.whitespace &&
 743        echo "x whitespace" >.gitattributes &&
 744        echo "    foo ();" >x &&
 745        git diff --check &&
 746        rm -f .gitattributes
 747'
 748
 749test_expect_success 'line numbers in --check output are correct' '
 750        echo "" >x &&
 751        echo "foo(); " >>x &&
 752        git diff --check | grep "x:2:"
 753'
 754
 755test_expect_success 'checkdiff detects new trailing blank lines (1)' '
 756        echo "foo();" >x &&
 757        echo "" >>x &&
 758        git diff --check | grep "new blank line"
 759'
 760
 761test_expect_success 'checkdiff detects new trailing blank lines (2)' '
 762        { echo a; echo b; echo; echo; } >x &&
 763        git add x &&
 764        { echo a; echo; echo; echo; echo; } >x &&
 765        git diff --check | grep "new blank line"
 766'
 767
 768test_expect_success 'checkdiff allows new blank lines' '
 769        git checkout x &&
 770        mv x y &&
 771        (
 772                echo "/* This is new */" &&
 773                echo "" &&
 774                cat y
 775        ) >x &&
 776        git diff --check
 777'
 778
 779cat <<EOF >expect
 780EOF
 781test_expect_success 'whitespace-only changes not reported' '
 782        git reset --hard &&
 783        echo >x "hello world" &&
 784        git add x &&
 785        git commit -m "hello 1" &&
 786        echo >x "hello  world" &&
 787        git diff -b >actual &&
 788        test_cmp expect actual
 789'
 790
 791cat <<EOF >expect
 792diff --git a/x b/z
 793similarity index NUM%
 794rename from x
 795rename to z
 796index 380c32a..a97b785 100644
 797EOF
 798test_expect_success 'whitespace-only changes reported across renames' '
 799        git reset --hard &&
 800        for i in 1 2 3 4 5 6 7 8 9; do echo "$i$i$i$i$i$i"; done >x &&
 801        git add x &&
 802        git commit -m "base" &&
 803        sed -e "5s/^/ /" x >z &&
 804        git rm x &&
 805        git add z &&
 806        git diff -w -M --cached |
 807        sed -e "/^similarity index /s/[0-9][0-9]*/NUM/" >actual &&
 808        test_cmp expect actual
 809'
 810
 811cat >expected <<\EOF
 812diff --git a/empty b/void
 813similarity index 100%
 814rename from empty
 815rename to void
 816EOF
 817
 818test_expect_success 'rename empty' '
 819        git reset --hard &&
 820        >empty &&
 821        git add empty &&
 822        git commit -m empty &&
 823        git mv empty void &&
 824        git diff -w --cached -M >current &&
 825        test_cmp expected current
 826'
 827
 828test_expect_success 'combined diff with autocrlf conversion' '
 829
 830        git reset --hard &&
 831        echo >x hello &&
 832        git commit -m "one side" x &&
 833        git checkout HEAD^ &&
 834        echo >x goodbye &&
 835        git commit -m "the other side" x &&
 836        git config core.autocrlf true &&
 837        test_must_fail git merge master &&
 838
 839        git diff | sed -e "1,/^@@@/d" >actual &&
 840        ! grep "^-" actual
 841
 842'
 843
 844# Start testing the colored format for whitespace checks
 845
 846test_expect_success 'setup diff colors' '
 847        git config color.diff.plain normal &&
 848        git config color.diff.meta bold &&
 849        git config color.diff.frag cyan &&
 850        git config color.diff.func normal &&
 851        git config color.diff.old red &&
 852        git config color.diff.new green &&
 853        git config color.diff.commit yellow &&
 854        git config color.diff.whitespace blue &&
 855
 856        git config core.autocrlf false
 857'
 858
 859test_expect_success 'diff that introduces a line with only tabs' '
 860        git config core.whitespace blank-at-eol &&
 861        git reset --hard &&
 862        echo "test" >x &&
 863        git commit -m "initial" x &&
 864        echo "{NTN}" | tr "NT" "\n\t" >>x &&
 865        git diff --color | test_decode_color >current &&
 866
 867        cat >expected <<-\EOF &&
 868        <BOLD>diff --git a/x b/x<RESET>
 869        <BOLD>index 9daeafb..2874b91 100644<RESET>
 870        <BOLD>--- a/x<RESET>
 871        <BOLD>+++ b/x<RESET>
 872        <CYAN>@@ -1 +1,4 @@<RESET>
 873         test<RESET>
 874        <GREEN>+<RESET><GREEN>{<RESET>
 875        <GREEN>+<RESET><BLUE>   <RESET>
 876        <GREEN>+<RESET><GREEN>}<RESET>
 877        EOF
 878
 879        test_cmp expected current
 880'
 881
 882test_expect_success 'diff that introduces and removes ws breakages' '
 883        git reset --hard &&
 884        {
 885                echo "0. blank-at-eol " &&
 886                echo "1. blank-at-eol "
 887        } >x &&
 888        git commit -a --allow-empty -m preimage &&
 889        {
 890                echo "0. blank-at-eol " &&
 891                echo "1. still-blank-at-eol " &&
 892                echo "2. and a new line "
 893        } >x &&
 894
 895        git diff --color |
 896        test_decode_color >current &&
 897
 898        cat >expected <<-\EOF &&
 899        <BOLD>diff --git a/x b/x<RESET>
 900        <BOLD>index d0233a2..700886e 100644<RESET>
 901        <BOLD>--- a/x<RESET>
 902        <BOLD>+++ b/x<RESET>
 903        <CYAN>@@ -1,2 +1,3 @@<RESET>
 904         0. blank-at-eol <RESET>
 905        <RED>-1. blank-at-eol <RESET>
 906        <GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
 907        <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
 908        EOF
 909
 910        test_cmp expected current
 911'
 912
 913test_expect_success 'ws-error-highlight test setup' '
 914
 915        git reset --hard &&
 916        {
 917                echo "0. blank-at-eol " &&
 918                echo "1. blank-at-eol "
 919        } >x &&
 920        git commit -a --allow-empty -m preimage &&
 921        {
 922                echo "0. blank-at-eol " &&
 923                echo "1. still-blank-at-eol " &&
 924                echo "2. and a new line "
 925        } >x &&
 926
 927        cat >expect.default-old <<-\EOF &&
 928        <BOLD>diff --git a/x b/x<RESET>
 929        <BOLD>index d0233a2..700886e 100644<RESET>
 930        <BOLD>--- a/x<RESET>
 931        <BOLD>+++ b/x<RESET>
 932        <CYAN>@@ -1,2 +1,3 @@<RESET>
 933         0. blank-at-eol <RESET>
 934        <RED>-<RESET><RED>1. blank-at-eol<RESET><BLUE> <RESET>
 935        <GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
 936        <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
 937        EOF
 938
 939        cat >expect.all <<-\EOF &&
 940        <BOLD>diff --git a/x b/x<RESET>
 941        <BOLD>index d0233a2..700886e 100644<RESET>
 942        <BOLD>--- a/x<RESET>
 943        <BOLD>+++ b/x<RESET>
 944        <CYAN>@@ -1,2 +1,3 @@<RESET>
 945         <RESET>0. blank-at-eol<RESET><BLUE> <RESET>
 946        <RED>-<RESET><RED>1. blank-at-eol<RESET><BLUE> <RESET>
 947        <GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
 948        <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
 949        EOF
 950
 951        cat >expect.none <<-\EOF
 952        <BOLD>diff --git a/x b/x<RESET>
 953        <BOLD>index d0233a2..700886e 100644<RESET>
 954        <BOLD>--- a/x<RESET>
 955        <BOLD>+++ b/x<RESET>
 956        <CYAN>@@ -1,2 +1,3 @@<RESET>
 957         0. blank-at-eol <RESET>
 958        <RED>-1. blank-at-eol <RESET>
 959        <GREEN>+1. still-blank-at-eol <RESET>
 960        <GREEN>+2. and a new line <RESET>
 961        EOF
 962
 963'
 964
 965test_expect_success 'test --ws-error-highlight option' '
 966
 967        git diff --color --ws-error-highlight=default,old |
 968        test_decode_color >current &&
 969        test_cmp expect.default-old current &&
 970
 971        git diff --color --ws-error-highlight=all |
 972        test_decode_color >current &&
 973        test_cmp expect.all current &&
 974
 975        git diff --color --ws-error-highlight=none |
 976        test_decode_color >current &&
 977        test_cmp expect.none current
 978
 979'
 980
 981test_expect_success 'test diff.wsErrorHighlight config' '
 982
 983        git -c diff.wsErrorHighlight=default,old diff --color |
 984        test_decode_color >current &&
 985        test_cmp expect.default-old current &&
 986
 987        git -c diff.wsErrorHighlight=all diff --color |
 988        test_decode_color >current &&
 989        test_cmp expect.all current &&
 990
 991        git -c diff.wsErrorHighlight=none diff --color |
 992        test_decode_color >current &&
 993        test_cmp expect.none current
 994
 995'
 996
 997test_expect_success 'option overrides diff.wsErrorHighlight' '
 998
 999        git -c diff.wsErrorHighlight=none \
1000                diff --color --ws-error-highlight=default,old |
1001        test_decode_color >current &&
1002        test_cmp expect.default-old current &&
1003
1004        git -c diff.wsErrorHighlight=default \
1005                diff --color --ws-error-highlight=all |
1006        test_decode_color >current &&
1007        test_cmp expect.all current &&
1008
1009        git -c diff.wsErrorHighlight=all \
1010                diff --color --ws-error-highlight=none |
1011        test_decode_color >current &&
1012        test_cmp expect.none current
1013
1014'
1015
1016test_expect_success 'detect moved code, complete file' '
1017        git reset --hard &&
1018        cat <<-\EOF >test.c &&
1019        #include<stdio.h>
1020        main()
1021        {
1022        printf("Hello World");
1023        }
1024        EOF
1025        git add test.c &&
1026        git commit -m "add main function" &&
1027        git mv test.c main.c &&
1028        test_config color.diff.oldMoved "normal red" &&
1029        test_config color.diff.newMoved "normal green" &&
1030        git diff HEAD --color-moved=zebra --color --no-renames | test_decode_color >actual &&
1031        cat >expected <<-\EOF &&
1032        <BOLD>diff --git a/main.c b/main.c<RESET>
1033        <BOLD>new file mode 100644<RESET>
1034        <BOLD>index 0000000..a986c57<RESET>
1035        <BOLD>--- /dev/null<RESET>
1036        <BOLD>+++ b/main.c<RESET>
1037        <CYAN>@@ -0,0 +1,5 @@<RESET>
1038        <BGREEN>+<RESET><BGREEN>#include<stdio.h><RESET>
1039        <BGREEN>+<RESET><BGREEN>main()<RESET>
1040        <BGREEN>+<RESET><BGREEN>{<RESET>
1041        <BGREEN>+<RESET><BGREEN>printf("Hello World");<RESET>
1042        <BGREEN>+<RESET><BGREEN>}<RESET>
1043        <BOLD>diff --git a/test.c b/test.c<RESET>
1044        <BOLD>deleted file mode 100644<RESET>
1045        <BOLD>index a986c57..0000000<RESET>
1046        <BOLD>--- a/test.c<RESET>
1047        <BOLD>+++ /dev/null<RESET>
1048        <CYAN>@@ -1,5 +0,0 @@<RESET>
1049        <BRED>-#include<stdio.h><RESET>
1050        <BRED>-main()<RESET>
1051        <BRED>-{<RESET>
1052        <BRED>-printf("Hello World");<RESET>
1053        <BRED>-}<RESET>
1054        EOF
1055
1056        test_cmp expected actual
1057'
1058
1059test_expect_success 'detect malicious moved code, inside file' '
1060        test_config color.diff.oldMoved "normal red" &&
1061        test_config color.diff.newMoved "normal green" &&
1062        test_config color.diff.oldMovedAlternative "blue" &&
1063        test_config color.diff.newMovedAlternative "yellow" &&
1064        git reset --hard &&
1065        cat <<-\EOF >main.c &&
1066                #include<stdio.h>
1067                int stuff()
1068                {
1069                        printf("Hello ");
1070                        printf("World\n");
1071                }
1072
1073                int secure_foo(struct user *u)
1074                {
1075                        if (!u->is_allowed_foo)
1076                                return;
1077                        foo(u);
1078                }
1079
1080                int main()
1081                {
1082                        foo();
1083                }
1084        EOF
1085        cat <<-\EOF >test.c &&
1086                #include<stdio.h>
1087                int bar()
1088                {
1089                        printf("Hello World, but different\n");
1090                }
1091
1092                int another_function()
1093                {
1094                        bar();
1095                }
1096        EOF
1097        git add main.c test.c &&
1098        git commit -m "add main and test file" &&
1099        cat <<-\EOF >main.c &&
1100                #include<stdio.h>
1101                int stuff()
1102                {
1103                        printf("Hello ");
1104                        printf("World\n");
1105                }
1106
1107                int main()
1108                {
1109                        foo();
1110                }
1111        EOF
1112        cat <<-\EOF >test.c &&
1113                #include<stdio.h>
1114                int bar()
1115                {
1116                        printf("Hello World, but different\n");
1117                }
1118
1119                int secure_foo(struct user *u)
1120                {
1121                        foo(u);
1122                        if (!u->is_allowed_foo)
1123                                return;
1124                }
1125
1126                int another_function()
1127                {
1128                        bar();
1129                }
1130        EOF
1131        git diff HEAD --no-renames --color-moved=zebra --color | test_decode_color >actual &&
1132        cat <<-\EOF >expected &&
1133        <BOLD>diff --git a/main.c b/main.c<RESET>
1134        <BOLD>index 27a619c..7cf9336 100644<RESET>
1135        <BOLD>--- a/main.c<RESET>
1136        <BOLD>+++ b/main.c<RESET>
1137        <CYAN>@@ -5,13 +5,6 @@<RESET> <RESET>printf("Hello ");<RESET>
1138         printf("World\n");<RESET>
1139         }<RESET>
1140         <RESET>
1141        <BRED>-int secure_foo(struct user *u)<RESET>
1142        <BRED>-{<RESET>
1143        <BLUE>-if (!u->is_allowed_foo)<RESET>
1144        <BLUE>-return;<RESET>
1145        <RED>-foo(u);<RESET>
1146        <RED>-}<RESET>
1147        <RED>-<RESET>
1148         int main()<RESET>
1149         {<RESET>
1150         foo();<RESET>
1151        <BOLD>diff --git a/test.c b/test.c<RESET>
1152        <BOLD>index 1dc1d85..2bedec9 100644<RESET>
1153        <BOLD>--- a/test.c<RESET>
1154        <BOLD>+++ b/test.c<RESET>
1155        <CYAN>@@ -4,6 +4,13 @@<RESET> <RESET>int bar()<RESET>
1156         printf("Hello World, but different\n");<RESET>
1157         }<RESET>
1158         <RESET>
1159        <BGREEN>+<RESET><BGREEN>int secure_foo(struct user *u)<RESET>
1160        <BGREEN>+<RESET><BGREEN>{<RESET>
1161        <GREEN>+<RESET><GREEN>foo(u);<RESET>
1162        <BGREEN>+<RESET><BGREEN>if (!u->is_allowed_foo)<RESET>
1163        <BGREEN>+<RESET><BGREEN>return;<RESET>
1164        <GREEN>+<RESET><GREEN>}<RESET>
1165        <GREEN>+<RESET>
1166         int another_function()<RESET>
1167         {<RESET>
1168         bar();<RESET>
1169        EOF
1170
1171        test_cmp expected actual
1172'
1173
1174test_expect_success 'plain moved code, inside file' '
1175        test_config color.diff.oldMoved "normal red" &&
1176        test_config color.diff.newMoved "normal green" &&
1177        test_config color.diff.oldMovedAlternative "blue" &&
1178        test_config color.diff.newMovedAlternative "yellow" &&
1179        # needs previous test as setup
1180        git diff HEAD --no-renames --color-moved=plain --color | test_decode_color >actual &&
1181        cat <<-\EOF >expected &&
1182        <BOLD>diff --git a/main.c b/main.c<RESET>
1183        <BOLD>index 27a619c..7cf9336 100644<RESET>
1184        <BOLD>--- a/main.c<RESET>
1185        <BOLD>+++ b/main.c<RESET>
1186        <CYAN>@@ -5,13 +5,6 @@<RESET> <RESET>printf("Hello ");<RESET>
1187         printf("World\n");<RESET>
1188         }<RESET>
1189         <RESET>
1190        <BRED>-int secure_foo(struct user *u)<RESET>
1191        <BRED>-{<RESET>
1192        <BRED>-if (!u->is_allowed_foo)<RESET>
1193        <BRED>-return;<RESET>
1194        <BRED>-foo(u);<RESET>
1195        <BRED>-}<RESET>
1196        <BRED>-<RESET>
1197         int main()<RESET>
1198         {<RESET>
1199         foo();<RESET>
1200        <BOLD>diff --git a/test.c b/test.c<RESET>
1201        <BOLD>index 1dc1d85..2bedec9 100644<RESET>
1202        <BOLD>--- a/test.c<RESET>
1203        <BOLD>+++ b/test.c<RESET>
1204        <CYAN>@@ -4,6 +4,13 @@<RESET> <RESET>int bar()<RESET>
1205         printf("Hello World, but different\n");<RESET>
1206         }<RESET>
1207         <RESET>
1208        <BGREEN>+<RESET><BGREEN>int secure_foo(struct user *u)<RESET>
1209        <BGREEN>+<RESET><BGREEN>{<RESET>
1210        <BGREEN>+<RESET><BGREEN>foo(u);<RESET>
1211        <BGREEN>+<RESET><BGREEN>if (!u->is_allowed_foo)<RESET>
1212        <BGREEN>+<RESET><BGREEN>return;<RESET>
1213        <BGREEN>+<RESET><BGREEN>}<RESET>
1214        <BGREEN>+<RESET>
1215         int another_function()<RESET>
1216         {<RESET>
1217         bar();<RESET>
1218        EOF
1219
1220        test_cmp expected actual
1221'
1222
1223test_expect_success 'detect permutations inside moved code -- dimmed_zebra' '
1224        git reset --hard &&
1225        cat <<-\EOF >lines.txt &&
1226                long line 1
1227                long line 2
1228                long line 3
1229                line 4
1230                line 5
1231                line 6
1232                line 7
1233                line 8
1234                line 9
1235                line 10
1236                line 11
1237                line 12
1238                line 13
1239                long line 14
1240                long line 15
1241                long line 16
1242        EOF
1243        git add lines.txt &&
1244        git commit -m "add poetry" &&
1245        cat <<-\EOF >lines.txt &&
1246                line 4
1247                line 5
1248                line 6
1249                line 7
1250                line 8
1251                line 9
1252                long line 1
1253                long line 2
1254                long line 3
1255                long line 14
1256                long line 15
1257                long line 16
1258                line 10
1259                line 11
1260                line 12
1261                line 13
1262        EOF
1263        test_config color.diff.oldMoved "magenta" &&
1264        test_config color.diff.newMoved "cyan" &&
1265        test_config color.diff.oldMovedAlternative "blue" &&
1266        test_config color.diff.newMovedAlternative "yellow" &&
1267        test_config color.diff.oldMovedDimmed "normal magenta" &&
1268        test_config color.diff.newMovedDimmed "normal cyan" &&
1269        test_config color.diff.oldMovedAlternativeDimmed "normal blue" &&
1270        test_config color.diff.newMovedAlternativeDimmed "normal yellow" &&
1271        git diff HEAD --no-renames --color-moved=dimmed_zebra --color |
1272                grep -v "index" |
1273                test_decode_color >actual &&
1274        cat <<-\EOF >expected &&
1275        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1276        <BOLD>--- a/lines.txt<RESET>
1277        <BOLD>+++ b/lines.txt<RESET>
1278        <CYAN>@@ -1,16 +1,16 @@<RESET>
1279        <BMAGENTA>-long line 1<RESET>
1280        <BMAGENTA>-long line 2<RESET>
1281        <BMAGENTA>-long line 3<RESET>
1282         line 4<RESET>
1283         line 5<RESET>
1284         line 6<RESET>
1285         line 7<RESET>
1286         line 8<RESET>
1287         line 9<RESET>
1288        <BCYAN>+<RESET><BCYAN>long line 1<RESET>
1289        <BCYAN>+<RESET><BCYAN>long line 2<RESET>
1290        <CYAN>+<RESET><CYAN>long line 3<RESET>
1291        <YELLOW>+<RESET><YELLOW>long line 14<RESET>
1292        <BYELLOW>+<RESET><BYELLOW>long line 15<RESET>
1293        <BYELLOW>+<RESET><BYELLOW>long line 16<RESET>
1294         line 10<RESET>
1295         line 11<RESET>
1296         line 12<RESET>
1297         line 13<RESET>
1298        <BMAGENTA>-long line 14<RESET>
1299        <BMAGENTA>-long line 15<RESET>
1300        <BMAGENTA>-long line 16<RESET>
1301        EOF
1302        test_cmp expected actual
1303'
1304
1305test_expect_success 'cmd option assumes configured colored-moved' '
1306        test_config color.diff.oldMoved "magenta" &&
1307        test_config color.diff.newMoved "cyan" &&
1308        test_config color.diff.oldMovedAlternative "blue" &&
1309        test_config color.diff.newMovedAlternative "yellow" &&
1310        test_config color.diff.oldMovedDimmed "normal magenta" &&
1311        test_config color.diff.newMovedDimmed "normal cyan" &&
1312        test_config color.diff.oldMovedAlternativeDimmed "normal blue" &&
1313        test_config color.diff.newMovedAlternativeDimmed "normal yellow" &&
1314        test_config diff.colorMoved zebra &&
1315        git diff HEAD --no-renames --color-moved --color |
1316                grep -v "index" |
1317                test_decode_color >actual &&
1318        cat <<-\EOF >expected &&
1319        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1320        <BOLD>--- a/lines.txt<RESET>
1321        <BOLD>+++ b/lines.txt<RESET>
1322        <CYAN>@@ -1,16 +1,16 @@<RESET>
1323        <MAGENTA>-long line 1<RESET>
1324        <MAGENTA>-long line 2<RESET>
1325        <MAGENTA>-long line 3<RESET>
1326         line 4<RESET>
1327         line 5<RESET>
1328         line 6<RESET>
1329         line 7<RESET>
1330         line 8<RESET>
1331         line 9<RESET>
1332        <CYAN>+<RESET><CYAN>long line 1<RESET>
1333        <CYAN>+<RESET><CYAN>long line 2<RESET>
1334        <CYAN>+<RESET><CYAN>long line 3<RESET>
1335        <YELLOW>+<RESET><YELLOW>long line 14<RESET>
1336        <YELLOW>+<RESET><YELLOW>long line 15<RESET>
1337        <YELLOW>+<RESET><YELLOW>long line 16<RESET>
1338         line 10<RESET>
1339         line 11<RESET>
1340         line 12<RESET>
1341         line 13<RESET>
1342        <MAGENTA>-long line 14<RESET>
1343        <MAGENTA>-long line 15<RESET>
1344        <MAGENTA>-long line 16<RESET>
1345        EOF
1346        test_cmp expected actual
1347'
1348
1349test_expect_success 'no effect from --color-moved with --word-diff' '
1350        cat <<-\EOF >text.txt &&
1351        Lorem Ipsum is simply dummy text of the printing and typesetting industry.
1352        EOF
1353        git add text.txt &&
1354        git commit -a -m "clean state" &&
1355        cat <<-\EOF >text.txt &&
1356        simply Lorem Ipsum dummy is text of the typesetting and printing industry.
1357        EOF
1358        git diff --color-moved --word-diff >actual &&
1359        git diff --word-diff >expect &&
1360        test_cmp expect actual
1361'
1362
1363test_expect_success 'set up whitespace tests' '
1364        git reset --hard &&
1365        # Note that these lines have no leading or trailing whitespace.
1366        cat <<-\EOF >lines.txt &&
1367        line 1
1368        line 2
1369        line 3
1370        line 4
1371        line 5
1372        long line 6
1373        long line 7
1374        long line 8
1375        long line 9
1376        EOF
1377        git add lines.txt &&
1378        git commit -m "add poetry" &&
1379        git config color.diff.oldMoved "magenta" &&
1380        git config color.diff.newMoved "cyan"
1381'
1382
1383test_expect_success 'move detection ignoring whitespace ' '
1384        q_to_tab <<-\EOF >lines.txt &&
1385        Qlong line 6
1386        Qlong line 7
1387        Qlong line 8
1388        Qchanged long line 9
1389        line 1
1390        line 2
1391        line 3
1392        line 4
1393        line 5
1394        EOF
1395        git diff HEAD --no-renames --color-moved --color |
1396                grep -v "index" |
1397                test_decode_color >actual &&
1398        cat <<-\EOF >expected &&
1399        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1400        <BOLD>--- a/lines.txt<RESET>
1401        <BOLD>+++ b/lines.txt<RESET>
1402        <CYAN>@@ -1,9 +1,9 @@<RESET>
1403        <GREEN>+<RESET> <GREEN>long line 6<RESET>
1404        <GREEN>+<RESET> <GREEN>long line 7<RESET>
1405        <GREEN>+<RESET> <GREEN>long line 8<RESET>
1406        <GREEN>+<RESET> <GREEN>changed long line 9<RESET>
1407         line 1<RESET>
1408         line 2<RESET>
1409         line 3<RESET>
1410         line 4<RESET>
1411         line 5<RESET>
1412        <RED>-long line 6<RESET>
1413        <RED>-long line 7<RESET>
1414        <RED>-long line 8<RESET>
1415        <RED>-long line 9<RESET>
1416        EOF
1417        test_cmp expected actual &&
1418
1419        git diff HEAD --no-renames -w --color-moved --color |
1420                grep -v "index" |
1421                test_decode_color >actual &&
1422        cat <<-\EOF >expected &&
1423        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1424        <BOLD>--- a/lines.txt<RESET>
1425        <BOLD>+++ b/lines.txt<RESET>
1426        <CYAN>@@ -1,9 +1,9 @@<RESET>
1427        <CYAN>+<RESET>  <CYAN>long line 6<RESET>
1428        <CYAN>+<RESET>  <CYAN>long line 7<RESET>
1429        <CYAN>+<RESET>  <CYAN>long line 8<RESET>
1430        <GREEN>+<RESET> <GREEN>changed long line 9<RESET>
1431         line 1<RESET>
1432         line 2<RESET>
1433         line 3<RESET>
1434         line 4<RESET>
1435         line 5<RESET>
1436        <MAGENTA>-long line 6<RESET>
1437        <MAGENTA>-long line 7<RESET>
1438        <MAGENTA>-long line 8<RESET>
1439        <RED>-long line 9<RESET>
1440        EOF
1441        test_cmp expected actual
1442'
1443
1444test_expect_success 'move detection ignoring whitespace changes' '
1445        git reset --hard &&
1446        # Lines 6-8 have a space change, but 9 is new whitespace
1447        q_to_tab <<-\EOF >lines.txt &&
1448        longQline 6
1449        longQline 7
1450        longQline 8
1451        long liQne 9
1452        line 1
1453        line 2
1454        line 3
1455        line 4
1456        line 5
1457        EOF
1458
1459        git diff HEAD --no-renames --color-moved --color |
1460                grep -v "index" |
1461                test_decode_color >actual &&
1462        cat <<-\EOF >expected &&
1463        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1464        <BOLD>--- a/lines.txt<RESET>
1465        <BOLD>+++ b/lines.txt<RESET>
1466        <CYAN>@@ -1,9 +1,9 @@<RESET>
1467        <GREEN>+<RESET><GREEN>long      line 6<RESET>
1468        <GREEN>+<RESET><GREEN>long      line 7<RESET>
1469        <GREEN>+<RESET><GREEN>long      line 8<RESET>
1470        <GREEN>+<RESET><GREEN>long li   ne 9<RESET>
1471         line 1<RESET>
1472         line 2<RESET>
1473         line 3<RESET>
1474         line 4<RESET>
1475         line 5<RESET>
1476        <RED>-long line 6<RESET>
1477        <RED>-long line 7<RESET>
1478        <RED>-long line 8<RESET>
1479        <RED>-long line 9<RESET>
1480        EOF
1481        test_cmp expected actual &&
1482
1483        git diff HEAD --no-renames -b --color-moved --color |
1484                grep -v "index" |
1485                test_decode_color >actual &&
1486        cat <<-\EOF >expected &&
1487        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1488        <BOLD>--- a/lines.txt<RESET>
1489        <BOLD>+++ b/lines.txt<RESET>
1490        <CYAN>@@ -1,9 +1,9 @@<RESET>
1491        <CYAN>+<RESET><CYAN>long        line 6<RESET>
1492        <CYAN>+<RESET><CYAN>long        line 7<RESET>
1493        <CYAN>+<RESET><CYAN>long        line 8<RESET>
1494        <GREEN>+<RESET><GREEN>long li   ne 9<RESET>
1495         line 1<RESET>
1496         line 2<RESET>
1497         line 3<RESET>
1498         line 4<RESET>
1499         line 5<RESET>
1500        <MAGENTA>-long line 6<RESET>
1501        <MAGENTA>-long line 7<RESET>
1502        <MAGENTA>-long line 8<RESET>
1503        <RED>-long line 9<RESET>
1504        EOF
1505        test_cmp expected actual
1506'
1507
1508test_expect_success 'move detection ignoring whitespace at eol' '
1509        git reset --hard &&
1510        # Lines 6-9 have new eol whitespace, but 9 also has it in the middle
1511        q_to_tab <<-\EOF >lines.txt &&
1512        long line 6Q
1513        long line 7Q
1514        long line 8Q
1515        longQline 9Q
1516        line 1
1517        line 2
1518        line 3
1519        line 4
1520        line 5
1521        EOF
1522
1523        # avoid cluttering the output with complaints about our eol whitespace
1524        test_config core.whitespace -blank-at-eol &&
1525
1526        git diff HEAD --no-renames --color-moved --color |
1527                grep -v "index" |
1528                test_decode_color >actual &&
1529        cat <<-\EOF >expected &&
1530        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1531        <BOLD>--- a/lines.txt<RESET>
1532        <BOLD>+++ b/lines.txt<RESET>
1533        <CYAN>@@ -1,9 +1,9 @@<RESET>
1534        <GREEN>+<RESET><GREEN>long line 6       <RESET>
1535        <GREEN>+<RESET><GREEN>long line 7       <RESET>
1536        <GREEN>+<RESET><GREEN>long line 8       <RESET>
1537        <GREEN>+<RESET><GREEN>long      line 9  <RESET>
1538         line 1<RESET>
1539         line 2<RESET>
1540         line 3<RESET>
1541         line 4<RESET>
1542         line 5<RESET>
1543        <RED>-long line 6<RESET>
1544        <RED>-long line 7<RESET>
1545        <RED>-long line 8<RESET>
1546        <RED>-long line 9<RESET>
1547        EOF
1548        test_cmp expected actual &&
1549
1550        git diff HEAD --no-renames --ignore-space-at-eol --color-moved --color |
1551                grep -v "index" |
1552                test_decode_color >actual &&
1553        cat <<-\EOF >expected &&
1554        <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
1555        <BOLD>--- a/lines.txt<RESET>
1556        <BOLD>+++ b/lines.txt<RESET>
1557        <CYAN>@@ -1,9 +1,9 @@<RESET>
1558        <CYAN>+<RESET><CYAN>long line 6 <RESET>
1559        <CYAN>+<RESET><CYAN>long line 7 <RESET>
1560        <CYAN>+<RESET><CYAN>long line 8 <RESET>
1561        <GREEN>+<RESET><GREEN>long      line 9  <RESET>
1562         line 1<RESET>
1563         line 2<RESET>
1564         line 3<RESET>
1565         line 4<RESET>
1566         line 5<RESET>
1567        <MAGENTA>-long line 6<RESET>
1568        <MAGENTA>-long line 7<RESET>
1569        <MAGENTA>-long line 8<RESET>
1570        <RED>-long line 9<RESET>
1571        EOF
1572        test_cmp expected actual
1573'
1574
1575test_expect_success 'clean up whitespace-test colors' '
1576        git config --unset color.diff.oldMoved &&
1577        git config --unset color.diff.newMoved
1578'
1579
1580test_expect_success '--color-moved block at end of diff output respects MIN_ALNUM_COUNT' '
1581        git reset --hard &&
1582        >bar &&
1583        cat <<-\EOF >foo &&
1584        irrelevant_line
1585        line1
1586        EOF
1587        git add foo bar &&
1588        git commit -m x &&
1589
1590        cat <<-\EOF >bar &&
1591        line1
1592        EOF
1593        cat <<-\EOF >foo &&
1594        irrelevant_line
1595        EOF
1596
1597        git diff HEAD --color-moved=zebra --color --no-renames |
1598                grep -v "index" |
1599                test_decode_color >actual &&
1600        cat >expected <<-\EOF &&
1601        <BOLD>diff --git a/bar b/bar<RESET>
1602        <BOLD>--- a/bar<RESET>
1603        <BOLD>+++ b/bar<RESET>
1604        <CYAN>@@ -0,0 +1 @@<RESET>
1605        <GREEN>+<RESET><GREEN>line1<RESET>
1606        <BOLD>diff --git a/foo b/foo<RESET>
1607        <BOLD>--- a/foo<RESET>
1608        <BOLD>+++ b/foo<RESET>
1609        <CYAN>@@ -1,2 +1 @@<RESET>
1610         irrelevant_line<RESET>
1611        <RED>-line1<RESET>
1612        EOF
1613
1614        test_cmp expected actual
1615'
1616
1617test_expect_success '--color-moved respects MIN_ALNUM_COUNT' '
1618        git reset --hard &&
1619        cat <<-\EOF >foo &&
1620        nineteen chars 456789
1621        irrelevant_line
1622        twenty chars 234567890
1623        EOF
1624        >bar &&
1625        git add foo bar &&
1626        git commit -m x &&
1627
1628        cat <<-\EOF >foo &&
1629        irrelevant_line
1630        EOF
1631        cat <<-\EOF >bar &&
1632        twenty chars 234567890
1633        nineteen chars 456789
1634        EOF
1635
1636        git diff HEAD --color-moved=zebra --color --no-renames |
1637                grep -v "index" |
1638                test_decode_color >actual &&
1639        cat >expected <<-\EOF &&
1640        <BOLD>diff --git a/bar b/bar<RESET>
1641        <BOLD>--- a/bar<RESET>
1642        <BOLD>+++ b/bar<RESET>
1643        <CYAN>@@ -0,0 +1,2 @@<RESET>
1644        <BOLD;CYAN>+<RESET><BOLD;CYAN>twenty chars 234567890<RESET>
1645        <GREEN>+<RESET><GREEN>nineteen chars 456789<RESET>
1646        <BOLD>diff --git a/foo b/foo<RESET>
1647        <BOLD>--- a/foo<RESET>
1648        <BOLD>+++ b/foo<RESET>
1649        <CYAN>@@ -1,3 +1 @@<RESET>
1650        <RED>-nineteen chars 456789<RESET>
1651         irrelevant_line<RESET>
1652        <BOLD;MAGENTA>-twenty chars 234567890<RESET>
1653        EOF
1654
1655        test_cmp expected actual
1656'
1657
1658test_expect_success '--color-moved treats adjacent blocks as separate for MIN_ALNUM_COUNT' '
1659        git reset --hard &&
1660        cat <<-\EOF >foo &&
1661        7charsA
1662        irrelevant_line
1663        7charsB
1664        7charsC
1665        EOF
1666        >bar &&
1667        git add foo bar &&
1668        git commit -m x &&
1669
1670        cat <<-\EOF >foo &&
1671        irrelevant_line
1672        EOF
1673        cat <<-\EOF >bar &&
1674        7charsB
1675        7charsC
1676        7charsA
1677        EOF
1678
1679        git diff HEAD --color-moved=zebra --color --no-renames | grep -v "index" | test_decode_color >actual &&
1680        cat >expected <<-\EOF &&
1681        <BOLD>diff --git a/bar b/bar<RESET>
1682        <BOLD>--- a/bar<RESET>
1683        <BOLD>+++ b/bar<RESET>
1684        <CYAN>@@ -0,0 +1,3 @@<RESET>
1685        <GREEN>+<RESET><GREEN>7charsB<RESET>
1686        <GREEN>+<RESET><GREEN>7charsC<RESET>
1687        <GREEN>+<RESET><GREEN>7charsA<RESET>
1688        <BOLD>diff --git a/foo b/foo<RESET>
1689        <BOLD>--- a/foo<RESET>
1690        <BOLD>+++ b/foo<RESET>
1691        <CYAN>@@ -1,4 +1 @@<RESET>
1692        <RED>-7charsA<RESET>
1693         irrelevant_line<RESET>
1694        <RED>-7charsB<RESET>
1695        <RED>-7charsC<RESET>
1696        EOF
1697
1698        test_cmp expected actual
1699'
1700
1701test_expect_success 'move detection with submodules' '
1702        test_create_repo bananas &&
1703        echo ripe >bananas/recipe &&
1704        git -C bananas add recipe &&
1705        test_commit fruit &&
1706        test_commit -C bananas recipe &&
1707        git submodule add ./bananas &&
1708        git add bananas &&
1709        git commit -a -m "bananas are like a heavy library?" &&
1710        echo foul >bananas/recipe &&
1711        echo ripe >fruit.t &&
1712
1713        git diff --submodule=diff --color-moved --color >actual &&
1714
1715        # no move detection as the moved line is across repository boundaries.
1716        test_decode_color <actual >decoded_actual &&
1717        ! grep BGREEN decoded_actual &&
1718        ! grep BRED decoded_actual &&
1719
1720        # nor did we mess with it another way
1721        git diff --submodule=diff --color | test_decode_color >expect &&
1722        test_cmp expect decoded_actual
1723'
1724
1725test_done