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
+'
253
+
254
+cat <<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(-)
267
+EOF
268
+
269
+cat <<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(-)
279
+EOF
280
+
281
+cat <<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(-)
291
+EOF
292
+
293
+test_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
303
+cat <<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/
313
+EOF
314
+
315
+# rearranged/text falls below default 3% threshold
316
+cat <<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/
322
+EOF
323
+
324
+# rearranged/text falls below default 3% threshold
325
+cat <<EOF >expect_diff_dirstat_CC
326
+ 32.6% changed/
327
+ 32.6% dst/copy/changed/
328
+ 32.6% dst/move/changed/
329
+EOF
330
+
331
+test_expect_success 'various ways to misspell --dirstat' '
332
+ test_must_fail git show --dirstat10 &&
333
+ test_must_fail git show -X=20
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
+# rearranged/text falls below 0% threshold (1 / (240 * 9 + 48 + 1) ~= 0.045 %)
355
+cat <<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/
366
+EOF
367
+
368
+cat <<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/
376
+EOF
377
+
378
+cat <<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/
385
+EOF
386
+
387
+test_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
+
396
+test_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 %)
406
+cat <<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/
421
+EOF
422
+
423
+cat <<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/
434
+EOF
435
+
436
+cat <<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/
446
+EOF
447
+
448
+test_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
+
457
+cat <<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/
469
+EOF
470
+
471
+cat <<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/
479
+EOF
480
+
481
+cat <<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/
488
+EOF
489
+
490
+test_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
+
499
+cat <<EOF >expect_diff_dirstat
500
+ 27.2% dst/copy/
501
+ 27.2% dst/move/
502
+ 27.2% src/move/
503
+EOF
504
+
505
+cat <<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/
513
+EOF
514
+
515
+cat <<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/
522
+EOF
523
+
524
+test_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
+
533
+cat <<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/
549
+EOF
550
+
551
+cat <<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/
562
+EOF
563
+
564
+cat <<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/
574
+EOF
575
+
576
+test_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
+
585
+test_done