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