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