diff: --ignore-cr-at-eol
[git] / t / t4015-diff-whitespace.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2006 Johannes E. Schindelin
4 #
5
6 test_description='Test special whitespace in diff engine.
7
8 '
9 . ./test-lib.sh
10 . "$TEST_DIRECTORY"/diff-lib.sh
11
12 test_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
53 test_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         >expect &&
97         git diff -w >out &&
98         test_cmp expect out &&
99
100         git diff -w -b >out &&
101         test_cmp expect out &&
102
103         git diff -w --ignore-space-at-eol >out &&
104         test_cmp expect out &&
105
106         git diff -w -b --ignore-space-at-eol >out &&
107         test_cmp expect out &&
108
109         git diff -w --ignore-cr-at-eol >out &&
110         test_cmp expect out &&
111
112         tr "Q_" "\015 " <<-\EOF >expect &&
113         diff --git a/x b/x
114         index d99af23..22d9f73 100644
115         --- a/x
116         +++ b/x
117         @@ -1,6 +1,6 @@
118         -whitespace at beginning
119         +_      whitespace at beginning
120          whitespace      change
121         -whitespace in the middle
122         +white space in the middle
123          whitespace at end__
124          unchanged line
125          CR at end
126         EOF
127         git diff -b >out &&
128         test_cmp expect out &&
129
130         git diff -b --ignore-space-at-eol >out &&
131         test_cmp expect out &&
132
133         git diff -b --ignore-cr-at-eol >out &&
134         test_cmp expect out &&
135
136         tr "Q_" "\015 " <<-\EOF >expect &&
137         diff --git a/x b/x
138         index d99af23..22d9f73 100644
139         --- a/x
140         +++ b/x
141         @@ -1,6 +1,6 @@
142         -whitespace at beginning
143         -whitespace change
144         -whitespace in the middle
145         +_      whitespace at beginning
146         +whitespace      change
147         +white space in the middle
148          whitespace at end__
149          unchanged line
150          CR at end
151         EOF
152         git diff --ignore-space-at-eol >out &&
153         test_cmp expect out &&
154
155         git diff --ignore-space-at-eol --ignore-cr-at-eol >out &&
156         test_cmp expect out &&
157
158         tr "Q_" "\015 " <<-\EOF >expect &&
159         diff --git a/x b/x
160         index_d99af23..22d9f73 100644
161         --- a/x
162         +++ b/x
163         @@ -1,6 +1,6 @@
164         -whitespace at beginning
165         -whitespace change
166         -whitespace in the middle
167         -whitespace at end
168         +_      whitespace at beginning
169         +whitespace_    _change
170         +white space in the middle
171         +whitespace at end__
172          unchanged line
173          CR at end
174         EOF
175         git diff --ignore-cr-at-eol >out &&
176         test_cmp expect out
177 '
178
179 test_expect_success 'ignore-blank-lines: only new lines' '
180         test_seq 5 >x &&
181         git update-index x &&
182         test_seq 5 | sed "/3/i\\
183 " >x &&
184         git diff --ignore-blank-lines >out &&
185         >expect &&
186         test_cmp out expect
187 '
188
189 test_expect_success 'ignore-blank-lines: only new lines with space' '
190         test_seq 5 >x &&
191         git update-index x &&
192         test_seq 5 | sed "/3/i\\
193  " >x &&
194         git diff -w --ignore-blank-lines >out &&
195         >expect &&
196         test_cmp out expect
197 '
198
199 test_expect_success 'ignore-blank-lines: after change' '
200         cat <<-\EOF >x &&
201         1
202         2
203
204         3
205         4
206         5
207
208         6
209         7
210         EOF
211         git update-index x &&
212         cat <<-\EOF >x &&
213         change
214
215         1
216         2
217         3
218         4
219         5
220         6
221
222         7
223         EOF
224         git diff --inter-hunk-context=100 --ignore-blank-lines >out.tmp &&
225         cat <<-\EOF >expected &&
226         diff --git a/x b/x
227         --- a/x
228         +++ b/x
229         @@ -1,6 +1,7 @@
230         +change
231         +
232          1
233          2
234         -
235          3
236          4
237          5
238         EOF
239         compare_diff_patch expected out.tmp
240 '
241
242 test_expect_success 'ignore-blank-lines: before change' '
243         cat <<-\EOF >x &&
244         1
245         2
246
247         3
248         4
249         5
250         6
251         7
252         EOF
253         git update-index x &&
254         cat <<-\EOF >x &&
255
256         1
257         2
258         3
259         4
260         5
261
262         6
263         7
264         change
265         EOF
266         git diff --inter-hunk-context=100 --ignore-blank-lines >out.tmp &&
267         cat <<-\EOF >expected &&
268         diff --git a/x b/x
269         --- a/x
270         +++ b/x
271         @@ -4,5 +4,7 @@
272          3
273          4
274          5
275         +
276          6
277          7
278         +change
279         EOF
280         compare_diff_patch expected out.tmp
281 '
282
283 test_expect_success 'ignore-blank-lines: between changes' '
284         cat <<-\EOF >x &&
285         1
286         2
287         3
288         4
289         5
290
291
292         6
293         7
294         8
295         9
296         10
297         EOF
298         git update-index x &&
299         cat <<-\EOF >x &&
300         change
301         1
302         2
303
304         3
305         4
306         5
307         6
308         7
309         8
310
311         9
312         10
313         change
314         EOF
315         git diff --ignore-blank-lines >out.tmp &&
316         cat <<-\EOF >expected &&
317         diff --git a/x b/x
318         --- a/x
319         +++ b/x
320         @@ -1,5 +1,7 @@
321         +change
322          1
323          2
324         +
325          3
326          4
327          5
328         @@ -8,5 +8,7 @@
329          6
330          7
331          8
332         +
333          9
334          10
335         +change
336         EOF
337         compare_diff_patch expected out.tmp
338 '
339
340 test_expect_success 'ignore-blank-lines: between changes (with interhunkctx)' '
341         test_seq 10 >x &&
342         git update-index x &&
343         cat <<-\EOF >x &&
344         change
345         1
346         2
347
348         3
349         4
350         5
351
352         6
353         7
354         8
355         9
356
357         10
358         change
359         EOF
360         git diff --inter-hunk-context=2 --ignore-blank-lines >out.tmp &&
361         cat <<-\EOF >expected &&
362         diff --git a/x b/x
363         --- a/x
364         +++ b/x
365         @@ -1,10 +1,15 @@
366         +change
367          1
368          2
369         +
370          3
371          4
372          5
373         +
374          6
375          7
376          8
377          9
378         +
379          10
380         +change
381         EOF
382         compare_diff_patch expected out.tmp
383 '
384
385 test_expect_success 'ignore-blank-lines: scattered spaces' '
386         test_seq 10 >x &&
387         git update-index x &&
388         cat <<-\EOF >x &&
389         change
390         1
391         2
392         3
393
394         4
395
396         5
397
398         6
399
400
401         7
402
403         8
404         9
405         10
406         change
407         EOF
408         git diff --inter-hunk-context=4 --ignore-blank-lines >out.tmp &&
409         cat <<-\EOF >expected &&
410         diff --git a/x b/x
411         --- a/x
412         +++ b/x
413         @@ -1,3 +1,4 @@
414         +change
415          1
416          2
417          3
418         @@ -8,3 +15,4 @@
419          8
420          9
421          10
422         +change
423         EOF
424         compare_diff_patch expected out.tmp
425 '
426
427 test_expect_success 'ignore-blank-lines: spaces coalesce' '
428         test_seq 6 >x &&
429         git update-index x &&
430         cat <<-\EOF >x &&
431         change
432         1
433         2
434         3
435
436         4
437
438         5
439
440         6
441         change
442         EOF
443         git diff --inter-hunk-context=4 --ignore-blank-lines >out.tmp &&
444         cat <<-\EOF >expected &&
445         diff --git a/x b/x
446         --- a/x
447         +++ b/x
448         @@ -1,6 +1,11 @@
449         +change
450          1
451          2
452          3
453         +
454          4
455         +
456          5
457         +
458          6
459         +change
460         EOF
461         compare_diff_patch expected out.tmp
462 '
463
464 test_expect_success 'ignore-blank-lines: mix changes and blank lines' '
465         test_seq 16 >x &&
466         git update-index x &&
467         cat <<-\EOF >x &&
468         change
469         1
470         2
471
472         3
473         4
474         5
475         change
476         6
477         7
478         8
479
480         9
481         10
482         11
483         change
484         12
485         13
486         14
487
488         15
489         16
490         change
491         EOF
492         git diff --ignore-blank-lines >out.tmp &&
493         cat <<-\EOF >expected &&
494         diff --git a/x b/x
495         --- a/x
496         +++ b/x
497         @@ -1,8 +1,11 @@
498         +change
499          1
500          2
501         +
502          3
503          4
504          5
505         +change
506          6
507          7
508          8
509         @@ -9,8 +13,11 @@
510          9
511          10
512          11
513         +change
514          12
515          13
516          14
517         +
518          15
519          16
520         +change
521         EOF
522         compare_diff_patch expected out.tmp
523 '
524
525 test_expect_success 'check mixed spaces and tabs in indent' '
526         # This is indented with SP HT SP.
527         echo "   foo();" >x &&
528         git diff --check | grep "space before tab in indent"
529 '
530
531 test_expect_success 'check mixed tabs and spaces in indent' '
532         # This is indented with HT SP HT.
533         echo "          foo();" >x &&
534         git diff --check | grep "space before tab in indent"
535 '
536
537 test_expect_success 'check with no whitespace errors' '
538         git commit -m "snapshot" &&
539         echo "foo();" >x &&
540         git diff --check
541 '
542
543 test_expect_success 'check with trailing whitespace' '
544         echo "foo(); " >x &&
545         test_must_fail git diff --check
546 '
547
548 test_expect_success 'check with space before tab in indent' '
549         # indent has space followed by hard tab
550         echo "  foo();" >x &&
551         test_must_fail git diff --check
552 '
553
554 test_expect_success '--check and --exit-code are not exclusive' '
555         git checkout x &&
556         git diff --check --exit-code
557 '
558
559 test_expect_success '--check and --quiet are not exclusive' '
560         git diff --check --quiet
561 '
562
563 test_expect_success 'check staged with no whitespace errors' '
564         echo "foo();" >x &&
565         git add x &&
566         git diff --cached --check
567 '
568
569 test_expect_success 'check staged with trailing whitespace' '
570         echo "foo(); " >x &&
571         git add x &&
572         test_must_fail git diff --cached --check
573 '
574
575 test_expect_success 'check staged with space before tab in indent' '
576         # indent has space followed by hard tab
577         echo "  foo();" >x &&
578         git add x &&
579         test_must_fail git diff --cached --check
580 '
581
582 test_expect_success 'check with no whitespace errors (diff-index)' '
583         echo "foo();" >x &&
584         git add x &&
585         git diff-index --check HEAD
586 '
587
588 test_expect_success 'check with trailing whitespace (diff-index)' '
589         echo "foo(); " >x &&
590         git add x &&
591         test_must_fail git diff-index --check HEAD
592 '
593
594 test_expect_success 'check with space before tab in indent (diff-index)' '
595         # indent has space followed by hard tab
596         echo "  foo();" >x &&
597         git add x &&
598         test_must_fail git diff-index --check HEAD
599 '
600
601 test_expect_success 'check staged with no whitespace errors (diff-index)' '
602         echo "foo();" >x &&
603         git add x &&
604         git diff-index --cached --check HEAD
605 '
606
607 test_expect_success 'check staged with trailing whitespace (diff-index)' '
608         echo "foo(); " >x &&
609         git add x &&
610         test_must_fail git diff-index --cached --check HEAD
611 '
612
613 test_expect_success 'check staged with space before tab in indent (diff-index)' '
614         # indent has space followed by hard tab
615         echo "  foo();" >x &&
616         git add x &&
617         test_must_fail git diff-index --cached --check HEAD
618 '
619
620 test_expect_success 'check with no whitespace errors (diff-tree)' '
621         echo "foo();" >x &&
622         git commit -m "new commit" x &&
623         git diff-tree --check HEAD^ HEAD
624 '
625
626 test_expect_success 'check with trailing whitespace (diff-tree)' '
627         echo "foo(); " >x &&
628         git commit -m "another commit" x &&
629         test_must_fail git diff-tree --check HEAD^ HEAD
630 '
631
632 test_expect_success 'check with space before tab in indent (diff-tree)' '
633         # indent has space followed by hard tab
634         echo "  foo();" >x &&
635         git commit -m "yet another" x &&
636         test_must_fail git diff-tree --check HEAD^ HEAD
637 '
638
639 test_expect_success 'check trailing whitespace (trailing-space: off)' '
640         git config core.whitespace "-trailing-space" &&
641         echo "foo ();   " >x &&
642         git diff --check
643 '
644
645 test_expect_success 'check trailing whitespace (trailing-space: on)' '
646         git config core.whitespace "trailing-space" &&
647         echo "foo ();   " >x &&
648         test_must_fail git diff --check
649 '
650
651 test_expect_success 'check space before tab in indent (space-before-tab: off)' '
652         # indent contains space followed by HT
653         git config core.whitespace "-space-before-tab" &&
654         echo "  foo ();" >x &&
655         git diff --check
656 '
657
658 test_expect_success 'check space before tab in indent (space-before-tab: on)' '
659         # indent contains space followed by HT
660         git config core.whitespace "space-before-tab" &&
661         echo "  foo ();   " >x &&
662         test_must_fail git diff --check
663 '
664
665 test_expect_success 'check spaces as indentation (indent-with-non-tab: off)' '
666         git config core.whitespace "-indent-with-non-tab" &&
667         echo "        foo ();" >x &&
668         git diff --check
669 '
670
671 test_expect_success 'check spaces as indentation (indent-with-non-tab: on)' '
672         git config core.whitespace "indent-with-non-tab" &&
673         echo "        foo ();" >x &&
674         test_must_fail git diff --check
675 '
676
677 test_expect_success 'ditto, but tabwidth=9' '
678         git config core.whitespace "indent-with-non-tab,tabwidth=9" &&
679         git diff --check
680 '
681
682 test_expect_success 'check tabs and spaces as indentation (indent-with-non-tab: on)' '
683         git config core.whitespace "indent-with-non-tab" &&
684         echo "                  foo ();" >x &&
685         test_must_fail git diff --check
686 '
687
688 test_expect_success 'ditto, but tabwidth=10' '
689         git config core.whitespace "indent-with-non-tab,tabwidth=10" &&
690         test_must_fail git diff --check
691 '
692
693 test_expect_success 'ditto, but tabwidth=20' '
694         git config core.whitespace "indent-with-non-tab,tabwidth=20" &&
695         git diff --check
696 '
697
698 test_expect_success 'check tabs as indentation (tab-in-indent: off)' '
699         git config core.whitespace "-tab-in-indent" &&
700         echo "  foo ();" >x &&
701         git diff --check
702 '
703
704 test_expect_success 'check tabs as indentation (tab-in-indent: on)' '
705         git config core.whitespace "tab-in-indent" &&
706         echo "  foo ();" >x &&
707         test_must_fail git diff --check
708 '
709
710 test_expect_success 'check tabs and spaces as indentation (tab-in-indent: on)' '
711         git config core.whitespace "tab-in-indent" &&
712         echo "                  foo ();" >x &&
713         test_must_fail git diff --check
714 '
715
716 test_expect_success 'ditto, but tabwidth=1 (must be irrelevant)' '
717         git config core.whitespace "tab-in-indent,tabwidth=1" &&
718         test_must_fail git diff --check
719 '
720
721 test_expect_success 'check tab-in-indent and indent-with-non-tab conflict' '
722         git config core.whitespace "tab-in-indent,indent-with-non-tab" &&
723         echo "foo ();" >x &&
724         test_must_fail git diff --check
725 '
726
727 test_expect_success 'check tab-in-indent excluded from wildcard whitespace attribute' '
728         git config --unset core.whitespace &&
729         echo "x whitespace" >.gitattributes &&
730         echo "    foo ();" >x &&
731         git diff --check &&
732         rm -f .gitattributes
733 '
734
735 test_expect_success 'line numbers in --check output are correct' '
736         echo "" >x &&
737         echo "foo(); " >>x &&
738         git diff --check | grep "x:2:"
739 '
740
741 test_expect_success 'checkdiff detects new trailing blank lines (1)' '
742         echo "foo();" >x &&
743         echo "" >>x &&
744         git diff --check | grep "new blank line"
745 '
746
747 test_expect_success 'checkdiff detects new trailing blank lines (2)' '
748         { echo a; echo b; echo; echo; } >x &&
749         git add x &&
750         { echo a; echo; echo; echo; echo; } >x &&
751         git diff --check | grep "new blank line"
752 '
753
754 test_expect_success 'checkdiff allows new blank lines' '
755         git checkout x &&
756         mv x y &&
757         (
758                 echo "/* This is new */" &&
759                 echo "" &&
760                 cat y
761         ) >x &&
762         git diff --check
763 '
764
765 cat <<EOF >expect
766 EOF
767 test_expect_success 'whitespace-only changes not reported' '
768         git reset --hard &&
769         echo >x "hello world" &&
770         git add x &&
771         git commit -m "hello 1" &&
772         echo >x "hello  world" &&
773         git diff -b >actual &&
774         test_cmp expect actual
775 '
776
777 cat <<EOF >expect
778 diff --git a/x b/z
779 similarity index NUM%
780 rename from x
781 rename to z
782 index 380c32a..a97b785 100644
783 EOF
784 test_expect_success 'whitespace-only changes reported across renames' '
785         git reset --hard &&
786         for i in 1 2 3 4 5 6 7 8 9; do echo "$i$i$i$i$i$i"; done >x &&
787         git add x &&
788         git commit -m "base" &&
789         sed -e "5s/^/ /" x >z &&
790         git rm x &&
791         git add z &&
792         git diff -w -M --cached |
793         sed -e "/^similarity index /s/[0-9][0-9]*/NUM/" >actual &&
794         test_cmp expect actual
795 '
796
797 cat >expected <<\EOF
798 diff --git a/empty b/void
799 similarity index 100%
800 rename from empty
801 rename to void
802 EOF
803
804 test_expect_success 'rename empty' '
805         git reset --hard &&
806         >empty &&
807         git add empty &&
808         git commit -m empty &&
809         git mv empty void &&
810         git diff -w --cached -M >current &&
811         test_cmp expected current
812 '
813
814 test_expect_success 'combined diff with autocrlf conversion' '
815
816         git reset --hard &&
817         echo >x hello &&
818         git commit -m "one side" x &&
819         git checkout HEAD^ &&
820         echo >x goodbye &&
821         git commit -m "the other side" x &&
822         git config core.autocrlf true &&
823         test_must_fail git merge master &&
824
825         git diff | sed -e "1,/^@@@/d" >actual &&
826         ! grep "^-" actual
827
828 '
829
830 # Start testing the colored format for whitespace checks
831
832 test_expect_success 'setup diff colors' '
833         git config color.diff always &&
834         git config color.diff.plain normal &&
835         git config color.diff.meta bold &&
836         git config color.diff.frag cyan &&
837         git config color.diff.func normal &&
838         git config color.diff.old red &&
839         git config color.diff.new green &&
840         git config color.diff.commit yellow &&
841         git config color.diff.whitespace blue &&
842
843         git config core.autocrlf false
844 '
845
846 test_expect_success 'diff that introduces a line with only tabs' '
847         git config core.whitespace blank-at-eol &&
848         git reset --hard &&
849         echo "test" >x &&
850         git commit -m "initial" x &&
851         echo "{NTN}" | tr "NT" "\n\t" >>x &&
852         git -c color.diff=always diff | test_decode_color >current &&
853
854         cat >expected <<-\EOF &&
855         <BOLD>diff --git a/x b/x<RESET>
856         <BOLD>index 9daeafb..2874b91 100644<RESET>
857         <BOLD>--- a/x<RESET>
858         <BOLD>+++ b/x<RESET>
859         <CYAN>@@ -1 +1,4 @@<RESET>
860          test<RESET>
861         <GREEN>+<RESET><GREEN>{<RESET>
862         <GREEN>+<RESET><BLUE>   <RESET>
863         <GREEN>+<RESET><GREEN>}<RESET>
864         EOF
865
866         test_cmp expected current
867 '
868
869 test_expect_success 'diff that introduces and removes ws breakages' '
870         git reset --hard &&
871         {
872                 echo "0. blank-at-eol " &&
873                 echo "1. blank-at-eol "
874         } >x &&
875         git commit -a --allow-empty -m preimage &&
876         {
877                 echo "0. blank-at-eol " &&
878                 echo "1. still-blank-at-eol " &&
879                 echo "2. and a new line "
880         } >x &&
881
882         git -c color.diff=always diff |
883         test_decode_color >current &&
884
885         cat >expected <<-\EOF &&
886         <BOLD>diff --git a/x b/x<RESET>
887         <BOLD>index d0233a2..700886e 100644<RESET>
888         <BOLD>--- a/x<RESET>
889         <BOLD>+++ b/x<RESET>
890         <CYAN>@@ -1,2 +1,3 @@<RESET>
891          0. blank-at-eol <RESET>
892         <RED>-1. blank-at-eol <RESET>
893         <GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
894         <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
895         EOF
896
897         test_cmp expected current
898 '
899
900 test_expect_success 'ws-error-highlight test setup' '
901
902         git reset --hard &&
903         {
904                 echo "0. blank-at-eol " &&
905                 echo "1. blank-at-eol "
906         } >x &&
907         git commit -a --allow-empty -m preimage &&
908         {
909                 echo "0. blank-at-eol " &&
910                 echo "1. still-blank-at-eol " &&
911                 echo "2. and a new line "
912         } >x &&
913
914         cat >expect.default-old <<-\EOF &&
915         <BOLD>diff --git a/x b/x<RESET>
916         <BOLD>index d0233a2..700886e 100644<RESET>
917         <BOLD>--- a/x<RESET>
918         <BOLD>+++ b/x<RESET>
919         <CYAN>@@ -1,2 +1,3 @@<RESET>
920          0. blank-at-eol <RESET>
921         <RED>-<RESET><RED>1. blank-at-eol<RESET><BLUE> <RESET>
922         <GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
923         <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
924         EOF
925
926         cat >expect.all <<-\EOF &&
927         <BOLD>diff --git a/x b/x<RESET>
928         <BOLD>index d0233a2..700886e 100644<RESET>
929         <BOLD>--- a/x<RESET>
930         <BOLD>+++ b/x<RESET>
931         <CYAN>@@ -1,2 +1,3 @@<RESET>
932          <RESET>0. blank-at-eol<RESET><BLUE> <RESET>
933         <RED>-<RESET><RED>1. blank-at-eol<RESET><BLUE> <RESET>
934         <GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
935         <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
936         EOF
937
938         cat >expect.none <<-\EOF
939         <BOLD>diff --git a/x b/x<RESET>
940         <BOLD>index d0233a2..700886e 100644<RESET>
941         <BOLD>--- a/x<RESET>
942         <BOLD>+++ b/x<RESET>
943         <CYAN>@@ -1,2 +1,3 @@<RESET>
944          0. blank-at-eol <RESET>
945         <RED>-1. blank-at-eol <RESET>
946         <GREEN>+1. still-blank-at-eol <RESET>
947         <GREEN>+2. and a new line <RESET>
948         EOF
949
950 '
951
952 test_expect_success 'test --ws-error-highlight option' '
953
954         git -c color.diff=always diff --ws-error-highlight=default,old |
955         test_decode_color >current &&
956         test_cmp expect.default-old current &&
957
958         git -c color.diff=always diff --ws-error-highlight=all |
959         test_decode_color >current &&
960         test_cmp expect.all current &&
961
962         git -c color.diff=always diff --ws-error-highlight=none |
963         test_decode_color >current &&
964         test_cmp expect.none current
965
966 '
967
968 test_expect_success 'test diff.wsErrorHighlight config' '
969
970         git -c color.diff=always -c diff.wsErrorHighlight=default,old diff |
971         test_decode_color >current &&
972         test_cmp expect.default-old current &&
973
974         git -c color.diff=always -c diff.wsErrorHighlight=all diff |
975         test_decode_color >current &&
976         test_cmp expect.all current &&
977
978         git -c color.diff=always -c diff.wsErrorHighlight=none diff |
979         test_decode_color >current &&
980         test_cmp expect.none current
981
982 '
983
984 test_expect_success 'option overrides diff.wsErrorHighlight' '
985
986         git -c color.diff=always -c diff.wsErrorHighlight=none \
987                 diff --ws-error-highlight=default,old |
988         test_decode_color >current &&
989         test_cmp expect.default-old current &&
990
991         git -c color.diff=always -c diff.wsErrorHighlight=default \
992                 diff --ws-error-highlight=all |
993         test_decode_color >current &&
994         test_cmp expect.all current &&
995
996         git -c color.diff=always -c diff.wsErrorHighlight=all \
997                 diff --ws-error-highlight=none |
998         test_decode_color >current &&
999         test_cmp expect.none current
1000
1001 '
1002
1003 test_done