]> git.ipfire.org Git - thirdparty/git.git/blame - t/t4034-diff-words.sh
Merge branch 'bc/hash-independent-tests-part-6'
[thirdparty/git.git] / t / t4034-diff-words.sh
CommitLineData
2e5d2003
JS
1#!/bin/sh
2
3test_description='word diff colors'
4
5. ./test-lib.sh
62d39359 6. "$TEST_DIRECTORY"/diff-lib.sh
2e5d2003 7
5094d158
JN
8cat >pre.simple <<-\EOF
9 h(4)
2e5d2003 10
5094d158
JN
11 a = b + c
12EOF
13cat >post.simple <<-\EOF
14 h(4),hh[44]
2e5d2003 15
5094d158 16 a = b + c
2e5d2003 17
5094d158 18 aa = a
2e5d2003 19
5094d158 20 aeff = aeff * ( aaa )
2e5d2003 21EOF
0253e126 22pre=$(git rev-parse --short $(git hash-object pre.simple))
23post=$(git rev-parse --short $(git hash-object post.simple))
24cat >expect.letter-runs-are-words <<-EOF
5094d158 25 <BOLD>diff --git a/pre b/post<RESET>
0253e126 26 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
27 <BOLD>--- a/pre<RESET>
28 <BOLD>+++ b/post<RESET>
29 <CYAN>@@ -1,3 +1,7 @@<RESET>
30 h(4),<GREEN>hh<RESET>[44]
2e5d2003 31
5094d158 32 a = b + c<RESET>
2e5d2003 33
5094d158 34 <GREEN>aa = a<RESET>
2e5d2003 35
5094d158 36 <GREEN>aeff = aeff * ( aaa<RESET> )
2e5d2003 37EOF
0253e126 38cat >expect.non-whitespace-is-word <<-EOF
5094d158 39 <BOLD>diff --git a/pre b/post<RESET>
0253e126 40 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
41 <BOLD>--- a/pre<RESET>
42 <BOLD>+++ b/post<RESET>
43 <CYAN>@@ -1,3 +1,7 @@<RESET>
44 h(4)<GREEN>,hh[44]<RESET>
2e5d2003 45
5094d158 46 a = b + c<RESET>
2e5d2003 47
5094d158 48 <GREEN>aa = a<RESET>
2e5d2003 49
5094d158 50 <GREEN>aeff = aeff * ( aaa )<RESET>
2e5d2003
JS
51EOF
52
5094d158 53word_diff () {
0253e126 54 pre=$(git rev-parse --short $(git hash-object pre)) &&
55 post=$(git rev-parse --short $(git hash-object post)) &&
5094d158
JN
56 test_must_fail git diff --no-index "$@" pre post >output &&
57 test_decode_color <output >output.decrypted &&
0253e126 58 sed -e "2s/index [^ ]*/index $pre..$post/" expect >expected
59 test_cmp expected output.decrypted
5094d158 60}
2e5d2003 61
5094d158
JN
62test_language_driver () {
63 lang=$1
64 test_expect_success "diff driver '$lang'" '
65 cp "$TEST_DIRECTORY/t4034/'"$lang"'/pre" \
66 "$TEST_DIRECTORY/t4034/'"$lang"'/post" \
67 "$TEST_DIRECTORY/t4034/'"$lang"'/expect" . &&
68 echo "* diff='"$lang"'" >.gitattributes &&
69 word_diff --color-words
70 '
71}
2e5d2003 72
5094d158
JN
73test_expect_success setup '
74 git config diff.color.old red &&
75 git config diff.color.new green &&
76 git config diff.color.func magenta
2e5d2003
JS
77'
78
5094d158
JN
79test_expect_success 'set up pre and post with runs of whitespace' '
80 cp pre.simple pre &&
81 cp post.simple post
882749a0
TR
82'
83
5094d158 84test_expect_success 'word diff with runs of whitespace' '
0253e126 85 cat >expect <<-EOF &&
5094d158 86 <BOLD>diff --git a/pre b/post<RESET>
0253e126 87 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
88 <BOLD>--- a/pre<RESET>
89 <BOLD>+++ b/post<RESET>
90 <CYAN>@@ -1,3 +1,7 @@<RESET>
91 <RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
92
93 a = b + c<RESET>
94
95 <GREEN>aa = a<RESET>
96
97 <GREEN>aeff = aeff * ( aaa )<RESET>
98 EOF
99 word_diff --color-words &&
100 word_diff --word-diff=color &&
882749a0 101 word_diff --color --word-diff=color
882749a0
TR
102'
103
882749a0 104test_expect_success '--word-diff=porcelain' '
0253e126 105 sed 's/#.*$//' >expect <<-EOF &&
5094d158 106 diff --git a/pre b/post
0253e126 107 index $pre..$post 100644
5094d158
JN
108 --- a/pre
109 +++ b/post
110 @@ -1,3 +1,7 @@
111 -h(4)
112 +h(4),hh[44]
113 ~
114 # significant space
115 ~
116 a = b + c
117 ~
118 ~
119 +aa = a
120 ~
121 ~
122 +aeff = aeff * ( aaa )
123 ~
124 EOF
882749a0 125 word_diff --word-diff=porcelain
882749a0
TR
126'
127
882749a0 128test_expect_success '--word-diff=plain' '
0253e126 129 cat >expect <<-EOF &&
5094d158 130 diff --git a/pre b/post
0253e126 131 index $pre..$post 100644
5094d158
JN
132 --- a/pre
133 +++ b/post
134 @@ -1,3 +1,7 @@
135 [-h(4)-]{+h(4),hh[44]+}
882749a0 136
5094d158 137 a = b + c
882749a0 138
5094d158 139 {+aa = a+}
882749a0 140
5094d158
JN
141 {+aeff = aeff * ( aaa )+}
142 EOF
143 word_diff --word-diff=plain &&
882749a0 144 word_diff --word-diff=plain --no-color
882749a0
TR
145'
146
5094d158 147test_expect_success '--word-diff=plain --color' '
0253e126 148 cat >expect <<-EOF &&
5094d158 149 <BOLD>diff --git a/pre b/post<RESET>
0253e126 150 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
151 <BOLD>--- a/pre<RESET>
152 <BOLD>+++ b/post<RESET>
153 <CYAN>@@ -1,3 +1,7 @@<RESET>
154 <RED>[-h(4)-]<RESET><GREEN>{+h(4),hh[44]+}<RESET>
882749a0 155
5094d158 156 a = b + c<RESET>
882749a0 157
5094d158 158 <GREEN>{+aa = a+}<RESET>
882749a0 159
5094d158
JN
160 <GREEN>{+aeff = aeff * ( aaa )+}<RESET>
161 EOF
882749a0 162 word_diff --word-diff=plain --color
882749a0
TR
163'
164
a4ca1465 165test_expect_success 'word diff without context' '
0253e126 166 cat >expect <<-EOF &&
5094d158 167 <BOLD>diff --git a/pre b/post<RESET>
0253e126 168 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
169 <BOLD>--- a/pre<RESET>
170 <BOLD>+++ b/post<RESET>
171 <CYAN>@@ -1 +1 @@<RESET>
172 <RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
173 <CYAN>@@ -3,0 +4,4 @@<RESET> <RESET><MAGENTA>a = b + c<RESET>
174
175 <GREEN>aa = a<RESET>
176
177 <GREEN>aeff = aeff * ( aaa )<RESET>
178 EOF
168eff3c 179 word_diff --color-words --unified=0
168eff3c
MH
180'
181
2b6a5417 182test_expect_success 'word diff with a regular expression' '
5094d158 183 cp expect.letter-runs-are-words expect &&
2b6a5417 184 word_diff --color-words="[a-z]+"
2b6a5417
JS
185'
186
5094d158 187test_expect_success 'set up a diff driver' '
ae3b970a 188 git config diff.testdriver.wordRegex "[^[:space:]]" &&
5094d158
JN
189 cat <<-\EOF >.gitattributes
190 pre diff=testdriver
191 post diff=testdriver
192 EOF
80c49c3d
TR
193'
194
98a4d87b 195test_expect_success 'option overrides .gitattributes' '
5094d158 196 cp expect.letter-runs-are-words expect &&
80c49c3d 197 word_diff --color-words="[a-z]+"
80c49c3d
TR
198'
199
98a4d87b 200test_expect_success 'use regex supplied by driver' '
5094d158 201 cp expect.non-whitespace-is-word expect &&
80c49c3d 202 word_diff --color-words
80c49c3d
TR
203'
204
5094d158 205test_expect_success 'set up diff.wordRegex option' '
ae3b970a 206 git config diff.wordRegex "[[:alnum:]]+"
98a4d87b
BSSJ
207'
208
98a4d87b 209test_expect_success 'command-line overrides config' '
5094d158 210 cp expect.letter-runs-are-words expect &&
98a4d87b
BSSJ
211 word_diff --color-words="[a-z]+"
212'
213
5094d158 214test_expect_success 'command-line overrides config: --word-diff-regex' '
0253e126 215 cat >expect <<-EOF &&
5094d158 216 <BOLD>diff --git a/pre b/post<RESET>
0253e126 217 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
218 <BOLD>--- a/pre<RESET>
219 <BOLD>+++ b/post<RESET>
220 <CYAN>@@ -1,3 +1,7 @@<RESET>
221 h(4),<GREEN>{+hh+}<RESET>[44]
882749a0 222
5094d158 223 a = b + c<RESET>
882749a0 224
5094d158 225 <GREEN>{+aa = a+}<RESET>
882749a0 226
5094d158
JN
227 <GREEN>{+aeff = aeff * ( aaa+}<RESET> )
228 EOF
882749a0
TR
229 word_diff --color --word-diff-regex="[a-z]+"
230'
231
98a4d87b 232test_expect_success '.gitattributes override config' '
5094d158 233 cp expect.non-whitespace-is-word expect &&
98a4d87b
BSSJ
234 word_diff --color-words
235'
236
5094d158 237test_expect_success 'setup: remove diff driver regex' '
ff73aa40 238 test_unconfig diff.testdriver.wordRegex
98a4d87b
BSSJ
239'
240
5094d158 241test_expect_success 'use configured regex' '
0253e126 242 cat >expect <<-EOF &&
5094d158 243 <BOLD>diff --git a/pre b/post<RESET>
0253e126 244 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
245 <BOLD>--- a/pre<RESET>
246 <BOLD>+++ b/post<RESET>
247 <CYAN>@@ -1,3 +1,7 @@<RESET>
248 h(4),<GREEN>hh[44<RESET>]
98a4d87b 249
5094d158 250 a = b + c<RESET>
98a4d87b 251
5094d158 252 <GREEN>aa = a<RESET>
98a4d87b 253
5094d158
JN
254 <GREEN>aeff = aeff * ( aaa<RESET> )
255 EOF
98a4d87b
BSSJ
256 word_diff --color-words
257'
258
2b6a5417 259test_expect_success 'test parsing words for newline' '
5094d158
JN
260 echo "aaa (aaa)" >pre &&
261 echo "aaa (aaa) aaa" >post &&
0253e126 262 pre=$(git rev-parse --short $(git hash-object pre)) &&
263 post=$(git rev-parse --short $(git hash-object post)) &&
264 cat >expect <<-EOF &&
5094d158 265 <BOLD>diff --git a/pre b/post<RESET>
0253e126 266 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
267 <BOLD>--- a/pre<RESET>
268 <BOLD>+++ b/post<RESET>
269 <CYAN>@@ -1 +1 @@<RESET>
270 aaa (aaa) <GREEN>aaa<RESET>
271 EOF
2b6a5417 272 word_diff --color-words="a+"
2b6a5417
JS
273'
274
2b6a5417 275test_expect_success 'test when words are only removed at the end' '
5094d158
JN
276 echo "(:" >pre &&
277 echo "(" >post &&
0253e126 278 pre=$(git rev-parse --short $(git hash-object pre)) &&
279 post=$(git rev-parse --short $(git hash-object post)) &&
280 cat >expect <<-EOF &&
5094d158 281 <BOLD>diff --git a/pre b/post<RESET>
0253e126 282 <BOLD>index $pre..$post 100644<RESET>
5094d158
JN
283 <BOLD>--- a/pre<RESET>
284 <BOLD>+++ b/post<RESET>
285 <CYAN>@@ -1 +1 @@<RESET>
286 (<RED>:<RESET>
287 EOF
2b6a5417 288 word_diff --color-words=.
2b6a5417
JS
289'
290
882749a0 291test_expect_success '--word-diff=none' '
5094d158
JN
292 echo "(:" >pre &&
293 echo "(" >post &&
0253e126 294 pre=$(git rev-parse --short $(git hash-object pre)) &&
295 post=$(git rev-parse --short $(git hash-object post)) &&
296 cat >expect <<-EOF &&
5094d158 297 diff --git a/pre b/post
0253e126 298 index $pre..$post 100644
5094d158
JN
299 --- a/pre
300 +++ b/post
301 @@ -1 +1 @@
302 -(:
303 +(
304 EOF
882749a0 305 word_diff --word-diff=plain --word-diff=none
882749a0
TR
306'
307
62d39359
JS
308test_expect_success 'unset default driver' '
309 test_unconfig diff.wordregex
310'
311
e90d065e 312test_language_driver ada
5094d158
JN
313test_language_driver bibtex
314test_language_driver cpp
315test_language_driver csharp
0719f3ee 316test_language_driver css
3c81760b 317test_language_driver dts
5094d158
JN
318test_language_driver fortran
319test_language_driver html
320test_language_driver java
53b10a14 321test_language_driver matlab
5094d158
JN
322test_language_driver objc
323test_language_driver pascal
5269edf1 324test_language_driver perl
5094d158
JN
325test_language_driver php
326test_language_driver python
327test_language_driver ruby
328test_language_driver tex
8d96e728 329
42536dd9 330test_expect_success 'word-diff with diff.sbe' '
42536dd9
JM
331 cat >pre <<-\EOF &&
332 a
333
334 b
335 EOF
336 cat >post <<-\EOF &&
337 a
338
339 c
340 EOF
0253e126 341 pre=$(git rev-parse --short $(git hash-object pre)) &&
342 post=$(git rev-parse --short $(git hash-object post)) &&
343 cat >expect <<-EOF &&
344 diff --git a/pre b/post
345 index $pre..$post 100644
346 --- a/pre
347 +++ b/post
348 @@ -1,3 +1,3 @@
349 a
350
351 [-b-]{+c+}
352 EOF
ff73aa40 353 test_config diff.suppress-blank-empty true &&
42536dd9
JM
354 word_diff --word-diff=plain
355'
356
c7c2bc0a 357test_expect_success 'word-diff with no newline at EOF' '
0253e126 358 printf "%s" "a a a a a" >pre &&
359 printf "%s" "a a ab a a" >post &&
360 pre=$(git rev-parse --short $(git hash-object pre)) &&
361 post=$(git rev-parse --short $(git hash-object post)) &&
362 cat >expect <<-EOF &&
c7c2bc0a 363 diff --git a/pre b/post
0253e126 364 index $pre..$post 100644
c7c2bc0a
TR
365 --- a/pre
366 +++ b/post
367 @@ -1 +1 @@
368 a a [-a-]{+ab+} a a
369 EOF
c7c2bc0a
TR
370 word_diff --word-diff=plain
371'
372
62d39359
JS
373test_expect_success 'setup history with two files' '
374 echo "a b; c" >a.tex &&
375 echo "a b; c" >z.txt &&
376 git add a.tex z.txt &&
377 git commit -minitial &&
378
379 # modify both
380 echo "a bx; c" >a.tex &&
381 echo "a bx; c" >z.txt &&
382 git commit -mmodified -a
383'
384
6440d341 385test_expect_success 'wordRegex for the first file does not apply to the second' '
62d39359 386 echo "*.tex diff=tex" >.gitattributes &&
ff73aa40 387 test_config diff.tex.wordRegex "[a-z]+|." &&
62d39359
JS
388 cat >expect <<-\EOF &&
389 diff --git a/a.tex b/a.tex
390 --- a/a.tex
391 +++ b/a.tex
392 @@ -1 +1 @@
393 a [-b-]{+bx+}; c
394 diff --git a/z.txt b/z.txt
395 --- a/z.txt
396 +++ b/z.txt
397 @@ -1 +1 @@
398 a [-b;-]{+bx;+} c
399 EOF
400 git diff --word-diff HEAD~ >actual &&
401 compare_diff_patch expect actual
402'
403
2e5d2003 404test_done