ce7c4033f8e54f3ee352fa559b9b3b7a4bb71837
1#!/bin/sh
2
3test_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
19test_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 &&
33unchanged line #0
34unchanged line #1
35unchanged line #2
36unchanged line #3
37unchanged line #4
38unchanged line #5
39unchanged line #6
40unchanged line #7
41unchanged line #8
42unchanged line #9
43EOF
44 cat <<EOF >changed/text &&
45changed line #0
46changed line #1
47changed line #2
48changed line #3
49changed line #4
50changed line #5
51changed line #6
52changed line #7
53changed line #8
54changed line #9
55EOF
56 cat <<EOF >rearranged/text &&
57rearranged line #0
58rearranged line #1
59rearranged line #2
60rearranged line #3
61rearranged line #4
62rearranged line #5
63rearranged line #6
64rearranged line #7
65rearranged line #8
66rearranged line #9
67EOF
68 cat <<EOF >src/copy/unchanged/text &&
69copy unchanged line #0
70copy unchanged line #1
71copy unchanged line #2
72copy unchanged line #3
73copy unchanged line #4
74copy unchanged line #5
75copy unchanged line #6
76copy unchanged line #7
77copy unchanged line #8
78copy unchanged line #9
79EOF
80 cat <<EOF >src/copy/changed/text &&
81copy changed line #0
82copy changed line #1
83copy changed line #2
84copy changed line #3
85copy changed line #4
86copy changed line #5
87copy changed line #6
88copy changed line #7
89copy changed line #8
90copy changed line #9
91EOF
92 cat <<EOF >src/copy/rearranged/text &&
93copy rearranged line #0
94copy rearranged line #1
95copy rearranged line #2
96copy rearranged line #3
97copy rearranged line #4
98copy rearranged line #5
99copy rearranged line #6
100copy rearranged line #7
101copy rearranged line #8
102copy rearranged line #9
103EOF
104 cat <<EOF >src/move/unchanged/text &&
105move unchanged line #0
106move unchanged line #1
107move unchanged line #2
108move unchanged line #3
109move unchanged line #4
110move unchanged line #5
111move unchanged line #6
112move unchanged line #7
113move unchanged line #8
114move unchanged line #9
115EOF
116 cat <<EOF >src/move/changed/text &&
117move changed line #0
118move changed line #1
119move changed line #2
120move changed line #3
121move changed line #4
122move changed line #5
123move changed line #6
124move changed line #7
125move changed line #8
126move changed line #9
127EOF
128 cat <<EOF >src/move/rearranged/text &&
129move rearranged line #0
130move rearranged line #1
131move rearranged line #2
132move rearranged line #3
133move rearranged line #4
134move rearranged line #5
135move rearranged line #6
136move rearranged line #7
137move rearranged line #8
138move rearranged line #9
139EOF
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 &&
152CHANGED XXXXXXX line #0
153changed line #1
154changed line #2
155changed line #3
156changed line #4
157changed line #5
158changed line #6
159changed line #7
160changed line #8
161changed line #9
162EOF
163 cat <<EOF >rearranged/text &&
164rearranged line #1
165rearranged line #0
166rearranged line #2
167rearranged line #3
168rearranged line #4
169rearranged line #5
170rearranged line #6
171rearranged line #7
172rearranged line #8
173rearranged line #9
174EOF
175 cat <<EOF >dst/copy/unchanged/text &&
176copy unchanged line #0
177copy unchanged line #1
178copy unchanged line #2
179copy unchanged line #3
180copy unchanged line #4
181copy unchanged line #5
182copy unchanged line #6
183copy unchanged line #7
184copy unchanged line #8
185copy unchanged line #9
186EOF
187 cat <<EOF >dst/copy/changed/text &&
188copy XXXCHANGED line #0
189copy changed line #1
190copy changed line #2
191copy changed line #3
192copy changed line #4
193copy changed line #5
194copy changed line #6
195copy changed line #7
196copy changed line #8
197copy changed line #9
198EOF
199 cat <<EOF >dst/copy/rearranged/text &&
200copy rearranged line #1
201copy rearranged line #0
202copy rearranged line #2
203copy rearranged line #3
204copy rearranged line #4
205copy rearranged line #5
206copy rearranged line #6
207copy rearranged line #7
208copy rearranged line #8
209copy rearranged line #9
210EOF
211 cat <<EOF >dst/move/unchanged/text &&
212move unchanged line #0
213move unchanged line #1
214move unchanged line #2
215move unchanged line #3
216move unchanged line #4
217move unchanged line #5
218move unchanged line #6
219move unchanged line #7
220move unchanged line #8
221move unchanged line #9
222EOF
223 cat <<EOF >dst/move/changed/text &&
224move XXXCHANGED line #0
225move changed line #1
226move changed line #2
227move changed line #3
228move changed line #4
229move changed line #5
230move changed line #6
231move changed line #7
232move changed line #8
233move changed line #9
234EOF
235 cat <<EOF >dst/move/rearranged/text &&
236move rearranged line #1
237move rearranged line #0
238move rearranged line #2
239move rearranged line #3
240move rearranged line #4
241move rearranged line #5
242move rearranged line #6
243move rearranged line #7
244move rearranged line #8
245move rearranged line #9
246EOF
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'
253
254cat <<EOF >expect_diff_stat
255 changed/text | 2 +-
256 dst/copy/changed/text | 10 ++++++++++
257 dst/copy/rearranged/text | 10 ++++++++++
258 dst/copy/unchanged/text | 10 ++++++++++
259 dst/move/changed/text | 10 ++++++++++
260 dst/move/rearranged/text | 10 ++++++++++
261 dst/move/unchanged/text | 10 ++++++++++
262 rearranged/text | 2 +-
263 src/move/changed/text | 10 ----------
264 src/move/rearranged/text | 10 ----------
265 src/move/unchanged/text | 10 ----------
266 11 files changed, 62 insertions(+), 32 deletions(-)
267EOF
268
269cat <<EOF >expect_diff_stat_M
270 changed/text | 2 +-
271 dst/copy/changed/text | 10 ++++++++++
272 dst/copy/rearranged/text | 10 ++++++++++
273 dst/copy/unchanged/text | 10 ++++++++++
274 {src => dst}/move/changed/text | 2 +-
275 {src => dst}/move/rearranged/text | 2 +-
276 {src => dst}/move/unchanged/text | 0
277 rearranged/text | 2 +-
278 8 files changed, 34 insertions(+), 4 deletions(-)
279EOF
280
281cat <<EOF >expect_diff_stat_CC
282 changed/text | 2 +-
283 {src => dst}/copy/changed/text | 2 +-
284 {src => dst}/copy/rearranged/text | 2 +-
285 {src => dst}/copy/unchanged/text | 0
286 {src => dst}/move/changed/text | 2 +-
287 {src => dst}/move/rearranged/text | 2 +-
288 {src => dst}/move/unchanged/text | 0
289 rearranged/text | 2 +-
290 8 files changed, 6 insertions(+), 6 deletions(-)
291EOF
292
293test_expect_success 'sanity check setup (--stat)' '
294 git diff --stat HEAD^..HEAD >actual_diff_stat &&
295 test_cmp expect_diff_stat actual_diff_stat &&
296 git diff --stat -M HEAD^..HEAD >actual_diff_stat_M &&
297 test_cmp expect_diff_stat_M actual_diff_stat_M &&
298 git diff --stat -C -C HEAD^..HEAD >actual_diff_stat_CC &&
299 test_cmp expect_diff_stat_CC actual_diff_stat_CC
300'
301
302# changed/text and rearranged/text falls below default 3% threshold
303cat <<EOF >expect_diff_dirstat
304 10.8% dst/copy/changed/
305 10.8% dst/copy/rearranged/
306 10.8% dst/copy/unchanged/
307 10.8% dst/move/changed/
308 10.8% dst/move/rearranged/
309 10.8% dst/move/unchanged/
310 10.8% src/move/changed/
311 10.8% src/move/rearranged/
312 10.8% src/move/unchanged/
313EOF
314
315# rearranged/text falls below default 3% threshold
316cat <<EOF >expect_diff_dirstat_M
317 5.8% changed/
318 29.3% dst/copy/changed/
319 29.3% dst/copy/rearranged/
320 29.3% dst/copy/unchanged/
321 5.8% dst/move/changed/
322EOF
323
324# rearranged/text falls below default 3% threshold
325cat <<EOF >expect_diff_dirstat_CC
326 32.6% changed/
327 32.6% dst/copy/changed/
328 32.6% dst/move/changed/
329EOF
330
331test_expect_success 'various ways to misspell --dirstat' '
332 test_must_fail git show --dirstat10 &&
333 test_must_fail git show -X=20
334'
335
336test_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
345test_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# rearranged/text falls below 0% threshold (1 / (240 * 9 + 48 + 1) ~= 0.045 %)
355cat <<EOF >expect_diff_dirstat
356 2.1% changed/
357 10.8% dst/copy/changed/
358 10.8% dst/copy/rearranged/
359 10.8% dst/copy/unchanged/
360 10.8% dst/move/changed/
361 10.8% dst/move/rearranged/
362 10.8% dst/move/unchanged/
363 10.8% src/move/changed/
364 10.8% src/move/rearranged/
365 10.8% src/move/unchanged/
366EOF
367
368cat <<EOF >expect_diff_dirstat_M
369 5.8% changed/
370 29.3% dst/copy/changed/
371 29.3% dst/copy/rearranged/
372 29.3% dst/copy/unchanged/
373 5.8% dst/move/changed/
374 0.1% dst/move/rearranged/
375 0.1% rearranged/
376EOF
377
378cat <<EOF >expect_diff_dirstat_CC
379 32.6% changed/
380 32.6% dst/copy/changed/
381 0.6% dst/copy/rearranged/
382 32.6% dst/move/changed/
383 0.6% dst/move/rearranged/
384 0.6% rearranged/
385EOF
386
387test_expect_success '--dirstat=0' '
388 git diff --dirstat=0 HEAD^..HEAD >actual_diff_dirstat &&
389 test_cmp expect_diff_dirstat actual_diff_dirstat &&
390 git diff --dirstat=0 -M HEAD^..HEAD >actual_diff_dirstat_M &&
391 test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
392 git diff --dirstat=0 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
393 test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
394'
395
396test_expect_success '-X0' '
397 git diff -X0 HEAD^..HEAD >actual_diff_dirstat &&
398 test_cmp expect_diff_dirstat actual_diff_dirstat &&
399 git diff -X0 -M HEAD^..HEAD >actual_diff_dirstat_M &&
400 test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
401 git diff -X0 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
402 test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
403'
404
405# rearranged/text falls below 0% threshold (1 / (240 * 9 + 48 + 1) ~= 0.045 %)
406cat <<EOF >expect_diff_dirstat
407 2.1% changed/
408 10.8% dst/copy/changed/
409 10.8% dst/copy/rearranged/
410 10.8% dst/copy/unchanged/
411 32.5% dst/copy/
412 10.8% dst/move/changed/
413 10.8% dst/move/rearranged/
414 10.8% dst/move/unchanged/
415 32.5% dst/move/
416 65.1% dst/
417 10.8% src/move/changed/
418 10.8% src/move/rearranged/
419 10.8% src/move/unchanged/
420 32.5% src/move/
421EOF
422
423cat <<EOF >expect_diff_dirstat_M
424 5.8% changed/
425 29.3% dst/copy/changed/
426 29.3% dst/copy/rearranged/
427 29.3% dst/copy/unchanged/
428 88.0% dst/copy/
429 5.8% dst/move/changed/
430 0.1% dst/move/rearranged/
431 5.9% dst/move/
432 94.0% dst/
433 0.1% rearranged/
434EOF
435
436cat <<EOF >expect_diff_dirstat_CC
437 32.6% changed/
438 32.6% dst/copy/changed/
439 0.6% dst/copy/rearranged/
440 33.3% dst/copy/
441 32.6% dst/move/changed/
442 0.6% dst/move/rearranged/
443 33.3% dst/move/
444 66.6% dst/
445 0.6% rearranged/
446EOF
447
448test_expect_success '--dirstat=0 --cumulative' '
449 git diff --dirstat=0 --cumulative HEAD^..HEAD >actual_diff_dirstat &&
450 test_cmp expect_diff_dirstat actual_diff_dirstat &&
451 git diff --dirstat=0 --cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
452 test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
453 git diff --dirstat=0 --cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
454 test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
455'
456
457cat <<EOF >expect_diff_dirstat
458 9.0% changed/
459 9.0% dst/copy/changed/
460 9.0% dst/copy/rearranged/
461 9.0% dst/copy/unchanged/
462 9.0% dst/move/changed/
463 9.0% dst/move/rearranged/
464 9.0% dst/move/unchanged/
465 9.0% rearranged/
466 9.0% src/move/changed/
467 9.0% src/move/rearranged/
468 9.0% src/move/unchanged/
469EOF
470
471cat <<EOF >expect_diff_dirstat_M
472 14.2% changed/
473 14.2% dst/copy/changed/
474 14.2% dst/copy/rearranged/
475 14.2% dst/copy/unchanged/
476 14.2% dst/move/changed/
477 14.2% dst/move/rearranged/
478 14.2% rearranged/
479EOF
480
481cat <<EOF >expect_diff_dirstat_CC
482 16.6% changed/
483 16.6% dst/copy/changed/
484 16.6% dst/copy/rearranged/
485 16.6% dst/move/changed/
486 16.6% dst/move/rearranged/
487 16.6% rearranged/
488EOF
489
490test_expect_success '--dirstat-by-file' '
491 git diff --dirstat-by-file HEAD^..HEAD >actual_diff_dirstat &&
492 test_cmp expect_diff_dirstat actual_diff_dirstat &&
493 git diff --dirstat-by-file -M HEAD^..HEAD >actual_diff_dirstat_M &&
494 test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
495 git diff --dirstat-by-file -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
496 test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
497'
498
499cat <<EOF >expect_diff_dirstat
500 27.2% dst/copy/
501 27.2% dst/move/
502 27.2% src/move/
503EOF
504
505cat <<EOF >expect_diff_dirstat_M
506 14.2% changed/
507 14.2% dst/copy/changed/
508 14.2% dst/copy/rearranged/
509 14.2% dst/copy/unchanged/
510 14.2% dst/move/changed/
511 14.2% dst/move/rearranged/
512 14.2% rearranged/
513EOF
514
515cat <<EOF >expect_diff_dirstat_CC
516 16.6% changed/
517 16.6% dst/copy/changed/
518 16.6% dst/copy/rearranged/
519 16.6% dst/move/changed/
520 16.6% dst/move/rearranged/
521 16.6% rearranged/
522EOF
523
524test_expect_success '--dirstat-by-file=10' '
525 git diff --dirstat-by-file=10 HEAD^..HEAD >actual_diff_dirstat &&
526 test_cmp expect_diff_dirstat actual_diff_dirstat &&
527 git diff --dirstat-by-file=10 -M HEAD^..HEAD >actual_diff_dirstat_M &&
528 test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
529 git diff --dirstat-by-file=10 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
530 test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
531'
532
533cat <<EOF >expect_diff_dirstat
534 9.0% changed/
535 9.0% dst/copy/changed/
536 9.0% dst/copy/rearranged/
537 9.0% dst/copy/unchanged/
538 27.2% dst/copy/
539 9.0% dst/move/changed/
540 9.0% dst/move/rearranged/
541 9.0% dst/move/unchanged/
542 27.2% dst/move/
543 54.5% dst/
544 9.0% rearranged/
545 9.0% src/move/changed/
546 9.0% src/move/rearranged/
547 9.0% src/move/unchanged/
548 27.2% src/move/
549EOF
550
551cat <<EOF >expect_diff_dirstat_M
552 14.2% changed/
553 14.2% dst/copy/changed/
554 14.2% dst/copy/rearranged/
555 14.2% dst/copy/unchanged/
556 42.8% dst/copy/
557 14.2% dst/move/changed/
558 14.2% dst/move/rearranged/
559 28.5% dst/move/
560 71.4% dst/
561 14.2% rearranged/
562EOF
563
564cat <<EOF >expect_diff_dirstat_CC
565 16.6% changed/
566 16.6% dst/copy/changed/
567 16.6% dst/copy/rearranged/
568 33.3% dst/copy/
569 16.6% dst/move/changed/
570 16.6% dst/move/rearranged/
571 33.3% dst/move/
572 66.6% dst/
573 16.6% rearranged/
574EOF
575
576test_expect_success '--dirstat-by-file --cumulative' '
577 git diff --dirstat-by-file --cumulative HEAD^..HEAD >actual_diff_dirstat &&
578 test_cmp expect_diff_dirstat actual_diff_dirstat &&
579 git diff --dirstat-by-file --cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
580 test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
581 git diff --dirstat-by-file --cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
582 test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
583'
584
585test_done