git add -p: use non-zero exit code when the diff generation failed
[git] / t / t4047-diff-dirstat.sh
1 #!/bin/sh
2
3 test_description='diff --dirstat tests'
4 . ./test-lib.sh
5
6 # set up two commits where the second commit has these files
7 # (10 lines in each file):
8 #
9 #   unchanged/text           (unchanged from 1st commit)
10 #   changed/text             (changed 1st line)
11 #   rearranged/text          (swapped 1st and 2nd line)
12 #   dst/copy/unchanged/text  (copied from src/copy/unchanged/text, unchanged)
13 #   dst/copy/changed/text    (copied from src/copy/changed/text, changed)
14 #   dst/copy/rearranged/text (copied from src/copy/rearranged/text, rearranged)
15 #   dst/move/unchanged/text  (moved from src/move/unchanged/text, unchanged)
16 #   dst/move/changed/text    (moved from src/move/changed/text, changed)
17 #   dst/move/rearranged/text (moved from src/move/rearranged/text, rearranged)
18
19 test_expect_success 'setup' '
20         mkdir unchanged &&
21         mkdir changed &&
22         mkdir rearranged &&
23         mkdir src &&
24         mkdir src/copy &&
25         mkdir src/copy/unchanged &&
26         mkdir src/copy/changed &&
27         mkdir src/copy/rearranged &&
28         mkdir src/move &&
29         mkdir src/move/unchanged &&
30         mkdir src/move/changed &&
31         mkdir src/move/rearranged &&
32         cat <<EOF >unchanged/text &&
33 unchanged       line #0
34 unchanged       line #1
35 unchanged       line #2
36 unchanged       line #3
37 unchanged       line #4
38 unchanged       line #5
39 unchanged       line #6
40 unchanged       line #7
41 unchanged       line #8
42 unchanged       line #9
43 EOF
44         cat <<EOF >changed/text &&
45 changed         line #0
46 changed         line #1
47 changed         line #2
48 changed         line #3
49 changed         line #4
50 changed         line #5
51 changed         line #6
52 changed         line #7
53 changed         line #8
54 changed         line #9
55 EOF
56         cat <<EOF >rearranged/text &&
57 rearranged      line #0
58 rearranged      line #1
59 rearranged      line #2
60 rearranged      line #3
61 rearranged      line #4
62 rearranged      line #5
63 rearranged      line #6
64 rearranged      line #7
65 rearranged      line #8
66 rearranged      line #9
67 EOF
68         cat <<EOF >src/copy/unchanged/text &&
69 copy  unchanged line #0
70 copy  unchanged line #1
71 copy  unchanged line #2
72 copy  unchanged line #3
73 copy  unchanged line #4
74 copy  unchanged line #5
75 copy  unchanged line #6
76 copy  unchanged line #7
77 copy  unchanged line #8
78 copy  unchanged line #9
79 EOF
80         cat <<EOF >src/copy/changed/text &&
81 copy    changed line #0
82 copy    changed line #1
83 copy    changed line #2
84 copy    changed line #3
85 copy    changed line #4
86 copy    changed line #5
87 copy    changed line #6
88 copy    changed line #7
89 copy    changed line #8
90 copy    changed line #9
91 EOF
92         cat <<EOF >src/copy/rearranged/text &&
93 copy rearranged line #0
94 copy rearranged line #1
95 copy rearranged line #2
96 copy rearranged line #3
97 copy rearranged line #4
98 copy rearranged line #5
99 copy rearranged line #6
100 copy rearranged line #7
101 copy rearranged line #8
102 copy rearranged line #9
103 EOF
104         cat <<EOF >src/move/unchanged/text &&
105 move  unchanged line #0
106 move  unchanged line #1
107 move  unchanged line #2
108 move  unchanged line #3
109 move  unchanged line #4
110 move  unchanged line #5
111 move  unchanged line #6
112 move  unchanged line #7
113 move  unchanged line #8
114 move  unchanged line #9
115 EOF
116         cat <<EOF >src/move/changed/text &&
117 move    changed line #0
118 move    changed line #1
119 move    changed line #2
120 move    changed line #3
121 move    changed line #4
122 move    changed line #5
123 move    changed line #6
124 move    changed line #7
125 move    changed line #8
126 move    changed line #9
127 EOF
128         cat <<EOF >src/move/rearranged/text &&
129 move rearranged line #0
130 move rearranged line #1
131 move rearranged line #2
132 move rearranged line #3
133 move rearranged line #4
134 move rearranged line #5
135 move rearranged line #6
136 move rearranged line #7
137 move rearranged line #8
138 move rearranged line #9
139 EOF
140         git add . &&
141         git commit -m "initial" &&
142         mkdir dst &&
143         mkdir dst/copy &&
144         mkdir dst/copy/unchanged &&
145         mkdir dst/copy/changed &&
146         mkdir dst/copy/rearranged &&
147         mkdir dst/move &&
148         mkdir dst/move/unchanged &&
149         mkdir dst/move/changed &&
150         mkdir dst/move/rearranged &&
151         cat <<EOF >changed/text &&
152 CHANGED XXXXXXX line #0
153 changed         line #1
154 changed         line #2
155 changed         line #3
156 changed         line #4
157 changed         line #5
158 changed         line #6
159 changed         line #7
160 changed         line #8
161 changed         line #9
162 EOF
163         cat <<EOF >rearranged/text &&
164 rearranged      line #1
165 rearranged      line #0
166 rearranged      line #2
167 rearranged      line #3
168 rearranged      line #4
169 rearranged      line #5
170 rearranged      line #6
171 rearranged      line #7
172 rearranged      line #8
173 rearranged      line #9
174 EOF
175         cat <<EOF >dst/copy/unchanged/text &&
176 copy  unchanged line #0
177 copy  unchanged line #1
178 copy  unchanged line #2
179 copy  unchanged line #3
180 copy  unchanged line #4
181 copy  unchanged line #5
182 copy  unchanged line #6
183 copy  unchanged line #7
184 copy  unchanged line #8
185 copy  unchanged line #9
186 EOF
187         cat <<EOF >dst/copy/changed/text &&
188 copy XXXCHANGED line #0
189 copy    changed line #1
190 copy    changed line #2
191 copy    changed line #3
192 copy    changed line #4
193 copy    changed line #5
194 copy    changed line #6
195 copy    changed line #7
196 copy    changed line #8
197 copy    changed line #9
198 EOF
199         cat <<EOF >dst/copy/rearranged/text &&
200 copy rearranged line #1
201 copy rearranged line #0
202 copy rearranged line #2
203 copy rearranged line #3
204 copy rearranged line #4
205 copy rearranged line #5
206 copy rearranged line #6
207 copy rearranged line #7
208 copy rearranged line #8
209 copy rearranged line #9
210 EOF
211         cat <<EOF >dst/move/unchanged/text &&
212 move  unchanged line #0
213 move  unchanged line #1
214 move  unchanged line #2
215 move  unchanged line #3
216 move  unchanged line #4
217 move  unchanged line #5
218 move  unchanged line #6
219 move  unchanged line #7
220 move  unchanged line #8
221 move  unchanged line #9
222 EOF
223         cat <<EOF >dst/move/changed/text &&
224 move XXXCHANGED line #0
225 move    changed line #1
226 move    changed line #2
227 move    changed line #3
228 move    changed line #4
229 move    changed line #5
230 move    changed line #6
231 move    changed line #7
232 move    changed line #8
233 move    changed line #9
234 EOF
235         cat <<EOF >dst/move/rearranged/text &&
236 move rearranged line #1
237 move rearranged line #0
238 move rearranged line #2
239 move rearranged line #3
240 move rearranged line #4
241 move rearranged line #5
242 move rearranged line #6
243 move rearranged line #7
244 move rearranged line #8
245 move rearranged line #9
246 EOF
247         git add . &&
248         git rm -r src/move/unchanged &&
249         git rm -r src/move/changed &&
250         git rm -r src/move/rearranged &&
251         git commit -m "changes" &&
252         git config diff.renames false
253 '
254
255 cat <<EOF >expect_diff_stat
256 1       1       changed/text
257 10      0       dst/copy/changed/text
258 10      0       dst/copy/rearranged/text
259 10      0       dst/copy/unchanged/text
260 10      0       dst/move/changed/text
261 10      0       dst/move/rearranged/text
262 10      0       dst/move/unchanged/text
263 1       1       rearranged/text
264 0       10      src/move/changed/text
265 0       10      src/move/rearranged/text
266 0       10      src/move/unchanged/text
267 EOF
268
269 cat <<EOF >expect_diff_stat_M
270 1       1       changed/text
271 10      0       dst/copy/changed/text
272 10      0       dst/copy/rearranged/text
273 10      0       dst/copy/unchanged/text
274 1       1       {src => dst}/move/changed/text
275 1       1       {src => dst}/move/rearranged/text
276 0       0       {src => dst}/move/unchanged/text
277 1       1       rearranged/text
278 EOF
279
280 cat <<EOF >expect_diff_stat_CC
281 1       1       changed/text
282 1       1       {src => dst}/copy/changed/text
283 1       1       {src => dst}/copy/rearranged/text
284 0       0       {src => dst}/copy/unchanged/text
285 1       1       {src => dst}/move/changed/text
286 1       1       {src => dst}/move/rearranged/text
287 0       0       {src => dst}/move/unchanged/text
288 1       1       rearranged/text
289 EOF
290
291 test_expect_success 'sanity check setup (--numstat)' '
292         git diff --numstat HEAD^..HEAD >actual_diff_stat &&
293         test_cmp expect_diff_stat actual_diff_stat &&
294         git diff --numstat -M HEAD^..HEAD >actual_diff_stat_M &&
295         test_cmp expect_diff_stat_M actual_diff_stat_M &&
296         git diff --numstat -C -C HEAD^..HEAD >actual_diff_stat_CC &&
297         test_cmp expect_diff_stat_CC actual_diff_stat_CC
298 '
299
300 # changed/text and rearranged/text falls below default 3% threshold
301 cat <<EOF >expect_diff_dirstat
302   10.8% dst/copy/changed/
303   10.8% dst/copy/rearranged/
304   10.8% dst/copy/unchanged/
305   10.8% dst/move/changed/
306   10.8% dst/move/rearranged/
307   10.8% dst/move/unchanged/
308   10.8% src/move/changed/
309   10.8% src/move/rearranged/
310   10.8% src/move/unchanged/
311 EOF
312
313 # rearranged/text falls below default 3% threshold
314 cat <<EOF >expect_diff_dirstat_M
315    5.8% changed/
316   29.3% dst/copy/changed/
317   29.3% dst/copy/rearranged/
318   29.3% dst/copy/unchanged/
319    5.8% dst/move/changed/
320 EOF
321
322 # rearranged/text falls below default 3% threshold
323 cat <<EOF >expect_diff_dirstat_CC
324   32.6% changed/
325   32.6% dst/copy/changed/
326   32.6% dst/move/changed/
327 EOF
328
329 test_expect_success 'various ways to misspell --dirstat' '
330         test_must_fail git show --dirstat10 &&
331         test_must_fail git show --dirstat10,files &&
332         test_must_fail git show -X=20 &&
333         test_must_fail git show -X=20,cumulative
334 '
335
336 test_expect_success 'vanilla --dirstat' '
337         git diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
338         test_cmp expect_diff_dirstat actual_diff_dirstat &&
339         git diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
340         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
341         git diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
342         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
343 '
344
345 test_expect_success 'vanilla -X' '
346         git diff -X HEAD^..HEAD >actual_diff_dirstat &&
347         test_cmp expect_diff_dirstat actual_diff_dirstat &&
348         git diff -X -M HEAD^..HEAD >actual_diff_dirstat_M &&
349         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
350         git diff -X -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
351         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
352 '
353
354 test_expect_success 'explicit defaults: --dirstat=changes,noncumulative,3' '
355         git diff --dirstat=changes,noncumulative,3 HEAD^..HEAD >actual_diff_dirstat &&
356         test_cmp expect_diff_dirstat actual_diff_dirstat &&
357         git diff --dirstat=changes,noncumulative,3 -M HEAD^..HEAD >actual_diff_dirstat_M &&
358         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
359         git diff --dirstat=changes,noncumulative,3 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
360         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
361 '
362
363 test_expect_success 'explicit defaults: -Xchanges,noncumulative,3' '
364         git diff -Xchanges,noncumulative,3 HEAD^..HEAD >actual_diff_dirstat &&
365         test_cmp expect_diff_dirstat actual_diff_dirstat &&
366         git diff -Xchanges,noncumulative,3 -M HEAD^..HEAD >actual_diff_dirstat_M &&
367         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
368         git diff -Xchanges,noncumulative,3 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
369         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
370 '
371
372 test_expect_success 'later options override earlier options:' '
373         git diff --dirstat=files,10,cumulative,changes,noncumulative,3 HEAD^..HEAD >actual_diff_dirstat &&
374         test_cmp expect_diff_dirstat actual_diff_dirstat &&
375         git diff --dirstat=files,10,cumulative,changes,noncumulative,3 -M HEAD^..HEAD >actual_diff_dirstat_M &&
376         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
377         git diff --dirstat=files,10,cumulative,changes,noncumulative,3 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
378         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC &&
379         git diff --dirstat=files --dirstat=10 --dirstat=cumulative --dirstat=changes --dirstat=noncumulative -X3 HEAD^..HEAD >actual_diff_dirstat &&
380         test_cmp expect_diff_dirstat actual_diff_dirstat &&
381         git diff --dirstat=files --dirstat=10 --dirstat=cumulative --dirstat=changes --dirstat=noncumulative -X3 -M HEAD^..HEAD >actual_diff_dirstat_M &&
382         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
383         git diff --dirstat=files --dirstat=10 --dirstat=cumulative --dirstat=changes --dirstat=noncumulative -X3 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
384         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
385 '
386
387 test_expect_success 'non-defaults in config overridden by explicit defaults on command line' '
388         git -c diff.dirstat=files,cumulative,50 diff --dirstat=changes,noncumulative,3 HEAD^..HEAD >actual_diff_dirstat &&
389         test_cmp expect_diff_dirstat actual_diff_dirstat &&
390         git -c diff.dirstat=files,cumulative,50 diff --dirstat=changes,noncumulative,3 -M HEAD^..HEAD >actual_diff_dirstat_M &&
391         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
392         git -c diff.dirstat=files,cumulative,50 diff --dirstat=changes,noncumulative,3 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
393         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
394 '
395
396 cat <<EOF >expect_diff_dirstat
397    2.1% changed/
398   10.8% dst/copy/changed/
399   10.8% dst/copy/rearranged/
400   10.8% dst/copy/unchanged/
401   10.8% dst/move/changed/
402   10.8% dst/move/rearranged/
403   10.8% dst/move/unchanged/
404    0.0% rearranged/
405   10.8% src/move/changed/
406   10.8% src/move/rearranged/
407   10.8% src/move/unchanged/
408 EOF
409
410 cat <<EOF >expect_diff_dirstat_M
411    5.8% changed/
412   29.3% dst/copy/changed/
413   29.3% dst/copy/rearranged/
414   29.3% dst/copy/unchanged/
415    5.8% dst/move/changed/
416    0.1% dst/move/rearranged/
417    0.1% rearranged/
418 EOF
419
420 cat <<EOF >expect_diff_dirstat_CC
421   32.6% changed/
422   32.6% dst/copy/changed/
423    0.6% dst/copy/rearranged/
424   32.6% dst/move/changed/
425    0.6% dst/move/rearranged/
426    0.6% rearranged/
427 EOF
428
429 test_expect_success '--dirstat=0' '
430         git diff --dirstat=0 HEAD^..HEAD >actual_diff_dirstat &&
431         test_cmp expect_diff_dirstat actual_diff_dirstat &&
432         git diff --dirstat=0 -M HEAD^..HEAD >actual_diff_dirstat_M &&
433         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
434         git diff --dirstat=0 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
435         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
436 '
437
438 test_expect_success '-X0' '
439         git diff -X0 HEAD^..HEAD >actual_diff_dirstat &&
440         test_cmp expect_diff_dirstat actual_diff_dirstat &&
441         git diff -X0 -M HEAD^..HEAD >actual_diff_dirstat_M &&
442         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
443         git diff -X0 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
444         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
445 '
446
447 test_expect_success 'diff.dirstat=0' '
448         git -c diff.dirstat=0 diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
449         test_cmp expect_diff_dirstat actual_diff_dirstat &&
450         git -c diff.dirstat=0 diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
451         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
452         git -c diff.dirstat=0 diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
453         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
454 '
455
456 cat <<EOF >expect_diff_dirstat
457    2.1% changed/
458   10.8% dst/copy/changed/
459   10.8% dst/copy/rearranged/
460   10.8% dst/copy/unchanged/
461   32.5% dst/copy/
462   10.8% dst/move/changed/
463   10.8% dst/move/rearranged/
464   10.8% dst/move/unchanged/
465   32.5% dst/move/
466   65.1% dst/
467    0.0% rearranged/
468   10.8% src/move/changed/
469   10.8% src/move/rearranged/
470   10.8% src/move/unchanged/
471   32.5% src/move/
472 EOF
473
474 cat <<EOF >expect_diff_dirstat_M
475    5.8% changed/
476   29.3% dst/copy/changed/
477   29.3% dst/copy/rearranged/
478   29.3% dst/copy/unchanged/
479   88.0% dst/copy/
480    5.8% dst/move/changed/
481    0.1% dst/move/rearranged/
482    5.9% dst/move/
483   94.0% dst/
484    0.1% rearranged/
485 EOF
486
487 cat <<EOF >expect_diff_dirstat_CC
488   32.6% changed/
489   32.6% dst/copy/changed/
490    0.6% dst/copy/rearranged/
491   33.3% dst/copy/
492   32.6% dst/move/changed/
493    0.6% dst/move/rearranged/
494   33.3% dst/move/
495   66.6% dst/
496    0.6% rearranged/
497 EOF
498
499 test_expect_success '--dirstat=0 --cumulative' '
500         git diff --dirstat=0 --cumulative HEAD^..HEAD >actual_diff_dirstat &&
501         test_cmp expect_diff_dirstat actual_diff_dirstat &&
502         git diff --dirstat=0 --cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
503         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
504         git diff --dirstat=0 --cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
505         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
506 '
507
508 test_expect_success '--dirstat=0,cumulative' '
509         git diff --dirstat=0,cumulative HEAD^..HEAD >actual_diff_dirstat &&
510         test_cmp expect_diff_dirstat actual_diff_dirstat &&
511         git diff --dirstat=0,cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
512         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
513         git diff --dirstat=0,cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
514         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
515 '
516
517 test_expect_success '-X0,cumulative' '
518         git diff -X0,cumulative HEAD^..HEAD >actual_diff_dirstat &&
519         test_cmp expect_diff_dirstat actual_diff_dirstat &&
520         git diff -X0,cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
521         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
522         git diff -X0,cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
523         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
524 '
525
526 test_expect_success 'diff.dirstat=0,cumulative' '
527         git -c diff.dirstat=0,cumulative diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
528         test_cmp expect_diff_dirstat actual_diff_dirstat &&
529         git -c diff.dirstat=0,cumulative diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
530         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
531         git -c diff.dirstat=0,cumulative diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
532         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
533 '
534
535 test_expect_success 'diff.dirstat=0 & --dirstat=cumulative' '
536         git -c diff.dirstat=0 diff --dirstat=cumulative HEAD^..HEAD >actual_diff_dirstat &&
537         test_cmp expect_diff_dirstat actual_diff_dirstat &&
538         git -c diff.dirstat=0 diff --dirstat=cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
539         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
540         git -c diff.dirstat=0 diff --dirstat=cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
541         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
542 '
543
544 cat <<EOF >expect_diff_dirstat
545    9.0% changed/
546    9.0% dst/copy/changed/
547    9.0% dst/copy/rearranged/
548    9.0% dst/copy/unchanged/
549    9.0% dst/move/changed/
550    9.0% dst/move/rearranged/
551    9.0% dst/move/unchanged/
552    9.0% rearranged/
553    9.0% src/move/changed/
554    9.0% src/move/rearranged/
555    9.0% src/move/unchanged/
556 EOF
557
558 cat <<EOF >expect_diff_dirstat_M
559   14.2% changed/
560   14.2% dst/copy/changed/
561   14.2% dst/copy/rearranged/
562   14.2% dst/copy/unchanged/
563   14.2% dst/move/changed/
564   14.2% dst/move/rearranged/
565   14.2% rearranged/
566 EOF
567
568 cat <<EOF >expect_diff_dirstat_CC
569   16.6% changed/
570   16.6% dst/copy/changed/
571   16.6% dst/copy/rearranged/
572   16.6% dst/move/changed/
573   16.6% dst/move/rearranged/
574   16.6% rearranged/
575 EOF
576
577 test_expect_success '--dirstat-by-file' '
578         git diff --dirstat-by-file HEAD^..HEAD >actual_diff_dirstat &&
579         test_cmp expect_diff_dirstat actual_diff_dirstat &&
580         git diff --dirstat-by-file -M HEAD^..HEAD >actual_diff_dirstat_M &&
581         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
582         git diff --dirstat-by-file -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
583         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
584 '
585
586 test_expect_success '--dirstat=files' '
587         git diff --dirstat=files HEAD^..HEAD >actual_diff_dirstat &&
588         test_cmp expect_diff_dirstat actual_diff_dirstat &&
589         git diff --dirstat=files -M HEAD^..HEAD >actual_diff_dirstat_M &&
590         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
591         git diff --dirstat=files -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
592         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
593 '
594
595 test_expect_success 'diff.dirstat=files' '
596         git -c diff.dirstat=files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
597         test_cmp expect_diff_dirstat actual_diff_dirstat &&
598         git -c diff.dirstat=files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
599         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
600         git -c diff.dirstat=files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
601         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
602 '
603
604 cat <<EOF >expect_diff_dirstat
605   27.2% dst/copy/
606   27.2% dst/move/
607   27.2% src/move/
608 EOF
609
610 cat <<EOF >expect_diff_dirstat_M
611   14.2% changed/
612   14.2% dst/copy/changed/
613   14.2% dst/copy/rearranged/
614   14.2% dst/copy/unchanged/
615   14.2% dst/move/changed/
616   14.2% dst/move/rearranged/
617   14.2% rearranged/
618 EOF
619
620 cat <<EOF >expect_diff_dirstat_CC
621   16.6% changed/
622   16.6% dst/copy/changed/
623   16.6% dst/copy/rearranged/
624   16.6% dst/move/changed/
625   16.6% dst/move/rearranged/
626   16.6% rearranged/
627 EOF
628
629 test_expect_success '--dirstat-by-file=10' '
630         git diff --dirstat-by-file=10 HEAD^..HEAD >actual_diff_dirstat &&
631         test_cmp expect_diff_dirstat actual_diff_dirstat &&
632         git diff --dirstat-by-file=10 -M HEAD^..HEAD >actual_diff_dirstat_M &&
633         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
634         git diff --dirstat-by-file=10 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
635         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
636 '
637
638 test_expect_success '--dirstat=files,10' '
639         git diff --dirstat=files,10 HEAD^..HEAD >actual_diff_dirstat &&
640         test_cmp expect_diff_dirstat actual_diff_dirstat &&
641         git diff --dirstat=files,10 -M HEAD^..HEAD >actual_diff_dirstat_M &&
642         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
643         git diff --dirstat=files,10 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
644         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
645 '
646
647 test_expect_success 'diff.dirstat=10,files' '
648         git -c diff.dirstat=10,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
649         test_cmp expect_diff_dirstat actual_diff_dirstat &&
650         git -c diff.dirstat=10,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
651         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
652         git -c diff.dirstat=10,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
653         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
654 '
655
656 cat <<EOF >expect_diff_dirstat
657    9.0% changed/
658    9.0% dst/copy/changed/
659    9.0% dst/copy/rearranged/
660    9.0% dst/copy/unchanged/
661   27.2% dst/copy/
662    9.0% dst/move/changed/
663    9.0% dst/move/rearranged/
664    9.0% dst/move/unchanged/
665   27.2% dst/move/
666   54.5% dst/
667    9.0% rearranged/
668    9.0% src/move/changed/
669    9.0% src/move/rearranged/
670    9.0% src/move/unchanged/
671   27.2% src/move/
672 EOF
673
674 cat <<EOF >expect_diff_dirstat_M
675   14.2% changed/
676   14.2% dst/copy/changed/
677   14.2% dst/copy/rearranged/
678   14.2% dst/copy/unchanged/
679   42.8% dst/copy/
680   14.2% dst/move/changed/
681   14.2% dst/move/rearranged/
682   28.5% dst/move/
683   71.4% dst/
684   14.2% rearranged/
685 EOF
686
687 cat <<EOF >expect_diff_dirstat_CC
688   16.6% changed/
689   16.6% dst/copy/changed/
690   16.6% dst/copy/rearranged/
691   33.3% dst/copy/
692   16.6% dst/move/changed/
693   16.6% dst/move/rearranged/
694   33.3% dst/move/
695   66.6% dst/
696   16.6% rearranged/
697 EOF
698
699 test_expect_success '--dirstat-by-file --cumulative' '
700         git diff --dirstat-by-file --cumulative HEAD^..HEAD >actual_diff_dirstat &&
701         test_cmp expect_diff_dirstat actual_diff_dirstat &&
702         git diff --dirstat-by-file --cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
703         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
704         git diff --dirstat-by-file --cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
705         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
706 '
707
708 test_expect_success '--dirstat=files,cumulative' '
709         git diff --dirstat=files,cumulative HEAD^..HEAD >actual_diff_dirstat &&
710         test_cmp expect_diff_dirstat actual_diff_dirstat &&
711         git diff --dirstat=files,cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
712         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
713         git diff --dirstat=files,cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
714         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
715 '
716
717 test_expect_success 'diff.dirstat=cumulative,files' '
718         git -c diff.dirstat=cumulative,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
719         test_cmp expect_diff_dirstat actual_diff_dirstat &&
720         git -c diff.dirstat=cumulative,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
721         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
722         git -c diff.dirstat=cumulative,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
723         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
724 '
725
726 cat <<EOF >expect_diff_dirstat
727   27.2% dst/copy/
728   27.2% dst/move/
729   54.5% dst/
730   27.2% src/move/
731 EOF
732
733 cat <<EOF >expect_diff_dirstat_M
734   14.2% changed/
735   14.2% dst/copy/changed/
736   14.2% dst/copy/rearranged/
737   14.2% dst/copy/unchanged/
738   42.8% dst/copy/
739   14.2% dst/move/changed/
740   14.2% dst/move/rearranged/
741   28.5% dst/move/
742   71.4% dst/
743   14.2% rearranged/
744 EOF
745
746 cat <<EOF >expect_diff_dirstat_CC
747   16.6% changed/
748   16.6% dst/copy/changed/
749   16.6% dst/copy/rearranged/
750   33.3% dst/copy/
751   16.6% dst/move/changed/
752   16.6% dst/move/rearranged/
753   33.3% dst/move/
754   66.6% dst/
755   16.6% rearranged/
756 EOF
757
758 test_expect_success '--dirstat=files,cumulative,10' '
759         git diff --dirstat=files,cumulative,10 HEAD^..HEAD >actual_diff_dirstat &&
760         test_cmp expect_diff_dirstat actual_diff_dirstat &&
761         git diff --dirstat=files,cumulative,10 -M HEAD^..HEAD >actual_diff_dirstat_M &&
762         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
763         git diff --dirstat=files,cumulative,10 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
764         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
765 '
766
767 test_expect_success 'diff.dirstat=10,cumulative,files' '
768         git -c diff.dirstat=10,cumulative,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
769         test_cmp expect_diff_dirstat actual_diff_dirstat &&
770         git -c diff.dirstat=10,cumulative,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
771         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
772         git -c diff.dirstat=10,cumulative,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
773         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
774 '
775
776 cat <<EOF >expect_diff_dirstat
777   27.2% dst/copy/
778   27.2% dst/move/
779   54.5% dst/
780   27.2% src/move/
781 EOF
782
783 cat <<EOF >expect_diff_dirstat_M
784   42.8% dst/copy/
785   28.5% dst/move/
786   71.4% dst/
787 EOF
788
789 cat <<EOF >expect_diff_dirstat_CC
790   33.3% dst/copy/
791   33.3% dst/move/
792   66.6% dst/
793 EOF
794
795 test_expect_success '--dirstat=files,cumulative,16.7' '
796         git diff --dirstat=files,cumulative,16.7 HEAD^..HEAD >actual_diff_dirstat &&
797         test_cmp expect_diff_dirstat actual_diff_dirstat &&
798         git diff --dirstat=files,cumulative,16.7 -M HEAD^..HEAD >actual_diff_dirstat_M &&
799         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
800         git diff --dirstat=files,cumulative,16.7 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
801         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
802 '
803
804 test_expect_success 'diff.dirstat=16.7,cumulative,files' '
805         git -c diff.dirstat=16.7,cumulative,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
806         test_cmp expect_diff_dirstat actual_diff_dirstat &&
807         git -c diff.dirstat=16.7,cumulative,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
808         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
809         git -c diff.dirstat=16.7,cumulative,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
810         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
811 '
812
813 test_expect_success 'diff.dirstat=16.70,cumulative,files' '
814         git -c diff.dirstat=16.70,cumulative,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
815         test_cmp expect_diff_dirstat actual_diff_dirstat &&
816         git -c diff.dirstat=16.70,cumulative,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
817         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
818         git -c diff.dirstat=16.70,cumulative,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
819         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
820 '
821
822 test_expect_success '--dirstat=files,cumulative,27.2' '
823         git diff --dirstat=files,cumulative,27.2 HEAD^..HEAD >actual_diff_dirstat &&
824         test_cmp expect_diff_dirstat actual_diff_dirstat &&
825         git diff --dirstat=files,cumulative,27.2 -M HEAD^..HEAD >actual_diff_dirstat_M &&
826         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
827         git diff --dirstat=files,cumulative,27.2 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
828         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
829 '
830
831 test_expect_success '--dirstat=files,cumulative,27.09' '
832         git diff --dirstat=files,cumulative,27.09 HEAD^..HEAD >actual_diff_dirstat &&
833         test_cmp expect_diff_dirstat actual_diff_dirstat &&
834         git diff --dirstat=files,cumulative,27.09 -M HEAD^..HEAD >actual_diff_dirstat_M &&
835         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
836         git diff --dirstat=files,cumulative,27.09 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
837         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
838 '
839
840 cat <<EOF >expect_diff_dirstat
841   10.6% dst/copy/changed/
842   10.6% dst/copy/rearranged/
843   10.6% dst/copy/unchanged/
844   10.6% dst/move/changed/
845   10.6% dst/move/rearranged/
846   10.6% dst/move/unchanged/
847   10.6% src/move/changed/
848   10.6% src/move/rearranged/
849   10.6% src/move/unchanged/
850 EOF
851
852 cat <<EOF >expect_diff_dirstat_M
853    5.2% changed/
854   26.3% dst/copy/changed/
855   26.3% dst/copy/rearranged/
856   26.3% dst/copy/unchanged/
857    5.2% dst/move/changed/
858    5.2% dst/move/rearranged/
859    5.2% rearranged/
860 EOF
861
862 cat <<EOF >expect_diff_dirstat_CC
863   16.6% changed/
864   16.6% dst/copy/changed/
865   16.6% dst/copy/rearranged/
866   16.6% dst/move/changed/
867   16.6% dst/move/rearranged/
868   16.6% rearranged/
869 EOF
870
871 test_expect_success '--dirstat=lines' '
872         git diff --dirstat=lines HEAD^..HEAD >actual_diff_dirstat &&
873         test_cmp expect_diff_dirstat actual_diff_dirstat &&
874         git diff --dirstat=lines -M HEAD^..HEAD >actual_diff_dirstat_M &&
875         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
876         git diff --dirstat=lines -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
877         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
878 '
879
880 test_expect_success 'diff.dirstat=lines' '
881         git -c diff.dirstat=lines diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
882         test_cmp expect_diff_dirstat actual_diff_dirstat &&
883         git -c diff.dirstat=lines diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
884         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
885         git -c diff.dirstat=lines diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
886         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
887 '
888
889 cat <<EOF >expect_diff_dirstat
890    2.1% changed/
891   10.6% dst/copy/changed/
892   10.6% dst/copy/rearranged/
893   10.6% dst/copy/unchanged/
894   10.6% dst/move/changed/
895   10.6% dst/move/rearranged/
896   10.6% dst/move/unchanged/
897    2.1% rearranged/
898   10.6% src/move/changed/
899   10.6% src/move/rearranged/
900   10.6% src/move/unchanged/
901 EOF
902
903 cat <<EOF >expect_diff_dirstat_M
904    5.2% changed/
905   26.3% dst/copy/changed/
906   26.3% dst/copy/rearranged/
907   26.3% dst/copy/unchanged/
908    5.2% dst/move/changed/
909    5.2% dst/move/rearranged/
910    5.2% rearranged/
911 EOF
912
913 cat <<EOF >expect_diff_dirstat_CC
914   16.6% changed/
915   16.6% dst/copy/changed/
916   16.6% dst/copy/rearranged/
917   16.6% dst/move/changed/
918   16.6% dst/move/rearranged/
919   16.6% rearranged/
920 EOF
921
922 test_expect_success '--dirstat=lines,0' '
923         git diff --dirstat=lines,0 HEAD^..HEAD >actual_diff_dirstat &&
924         test_cmp expect_diff_dirstat actual_diff_dirstat &&
925         git diff --dirstat=lines,0 -M HEAD^..HEAD >actual_diff_dirstat_M &&
926         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
927         git diff --dirstat=lines,0 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
928         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
929 '
930
931 test_expect_success 'diff.dirstat=0,lines' '
932         git -c diff.dirstat=0,lines diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
933         test_cmp expect_diff_dirstat actual_diff_dirstat &&
934         git -c diff.dirstat=0,lines diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
935         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
936         git -c diff.dirstat=0,lines diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
937         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
938 '
939
940 test_expect_success '--dirstat=future_param,lines,0 should fail loudly' '
941         test_must_fail git diff --dirstat=future_param,lines,0 HEAD^..HEAD >actual_diff_dirstat 2>actual_error &&
942         test_debug "cat actual_error" &&
943         test_must_be_empty actual_diff_dirstat &&
944         test_i18ngrep -q "future_param" actual_error &&
945         test_i18ngrep -q "\--dirstat" actual_error
946 '
947
948 test_expect_success '--dirstat=dummy1,cumulative,2dummy should report both unrecognized parameters' '
949         test_must_fail git diff --dirstat=dummy1,cumulative,2dummy HEAD^..HEAD >actual_diff_dirstat 2>actual_error &&
950         test_debug "cat actual_error" &&
951         test_must_be_empty actual_diff_dirstat &&
952         test_i18ngrep -q "dummy1" actual_error &&
953         test_i18ngrep -q "2dummy" actual_error &&
954         test_i18ngrep -q "\--dirstat" actual_error
955 '
956
957 test_expect_success 'diff.dirstat=future_param,0,lines should warn, but still work' '
958         git -c diff.dirstat=future_param,0,lines diff --dirstat HEAD^..HEAD >actual_diff_dirstat 2>actual_error &&
959         test_debug "cat actual_error" &&
960         test_cmp expect_diff_dirstat actual_diff_dirstat &&
961         test_i18ngrep -q "future_param" actual_error &&
962         test_i18ngrep -q "diff\\.dirstat" actual_error &&
963
964         git -c diff.dirstat=future_param,0,lines diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M 2>actual_error &&
965         test_debug "cat actual_error" &&
966         test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
967         test_i18ngrep -q "future_param" actual_error &&
968         test_i18ngrep -q "diff\\.dirstat" actual_error &&
969
970         git -c diff.dirstat=future_param,0,lines diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC 2>actual_error &&
971         test_debug "cat actual_error" &&
972         test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC &&
973         test_i18ngrep -q "future_param" actual_error &&
974         test_i18ngrep -q "diff\\.dirstat" actual_error
975 '
976
977 test_expect_success '--shortstat --dirstat should output only one dirstat' '
978         git diff --shortstat --dirstat=changes HEAD^..HEAD >out &&
979         grep " dst/copy/changed/$" out >actual_diff_shortstat_dirstat_changes &&
980         test_line_count = 1 actual_diff_shortstat_dirstat_changes &&
981
982         git diff --shortstat --dirstat=lines HEAD^..HEAD >out &&
983         grep " dst/copy/changed/$" out >actual_diff_shortstat_dirstat_lines &&
984         test_line_count = 1 actual_diff_shortstat_dirstat_lines &&
985
986         git diff --shortstat --dirstat=files HEAD^..HEAD >out &&
987         grep " dst/copy/changed/$" out >actual_diff_shortstat_dirstat_files &&
988         test_line_count = 1 actual_diff_shortstat_dirstat_files
989 '
990
991 test_done