]>
Commit | Line | Data |
---|---|---|
2e5d2003 JS |
1 | #!/bin/sh |
2 | ||
3 | test_description='word diff colors' | |
4 | ||
5 | . ./test-lib.sh | |
62d39359 | 6 | . "$TEST_DIRECTORY"/diff-lib.sh |
2e5d2003 | 7 | |
5094d158 JN |
8 | cat >pre.simple <<-\EOF |
9 | h(4) | |
2e5d2003 | 10 | |
5094d158 JN |
11 | a = b + c |
12 | EOF | |
13 | cat >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 | 21 | EOF |
0253e126 | 22 | pre=$(git rev-parse --short $(git hash-object pre.simple)) |
23 | post=$(git rev-parse --short $(git hash-object post.simple)) | |
24 | cat >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 | 37 | EOF |
0253e126 | 38 | cat >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 |
51 | EOF |
52 | ||
5094d158 | 53 | word_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 |
62 | test_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 |
73 | test_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 |
79 | test_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 | 84 | test_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 | 104 | test_expect_success '--word-diff=porcelain' ' |
c76b84a1 | 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 | 128 | test_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 | 147 | test_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 | 165 | test_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 | 182 | test_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 | 187 | test_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 | 195 | test_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 | 200 | test_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 | 205 | test_expect_success 'set up diff.wordRegex option' ' |
ae3b970a | 206 | git config diff.wordRegex "[[:alnum:]]+" |
98a4d87b BSSJ |
207 | ' |
208 | ||
98a4d87b | 209 | test_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 | 214 | test_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 | 232 | test_expect_success '.gitattributes override config' ' |
5094d158 | 233 | cp expect.non-whitespace-is-word expect && |
98a4d87b BSSJ |
234 | word_diff --color-words |
235 | ' | |
236 | ||
5094d158 | 237 | test_expect_success 'setup: remove diff driver regex' ' |
ff73aa40 | 238 | test_unconfig diff.testdriver.wordRegex |
98a4d87b BSSJ |
239 | ' |
240 | ||
5094d158 | 241 | test_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 | 259 | test_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 | 275 | test_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 | 291 | test_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 |
308 | test_expect_success 'unset default driver' ' |
309 | test_unconfig diff.wordregex | |
310 | ' | |
311 | ||
e90d065e | 312 | test_language_driver ada |
5094d158 JN |
313 | test_language_driver bibtex |
314 | test_language_driver cpp | |
315 | test_language_driver csharp | |
0719f3ee | 316 | test_language_driver css |
3c81760b | 317 | test_language_driver dts |
5094d158 JN |
318 | test_language_driver fortran |
319 | test_language_driver html | |
320 | test_language_driver java | |
53b10a14 | 321 | test_language_driver matlab |
5094d158 JN |
322 | test_language_driver objc |
323 | test_language_driver pascal | |
5269edf1 | 324 | test_language_driver perl |
5094d158 JN |
325 | test_language_driver php |
326 | test_language_driver python | |
327 | test_language_driver ruby | |
328 | test_language_driver tex | |
8d96e728 | 329 | |
42536dd9 | 330 | test_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 | 357 | test_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 |
373 | test_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 | 385 | test_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 | 404 | test_done |