@matheusbsbs / matheus-bagliano / commits / 5502039d87
Fork 0

Add several testcases for --dirstat and friends

Currently, t4013 is the only selftest that exercises the --dirstat machinery, but it only does a superficial verification of --dirstat's output. This patch adds a new selftest - t4047-diff-dirstat.sh - which prepares a commit containing: - unchanged files, changed files and files with rearranged lines - copied files, moved files, and unmoved files It then verifies the correct dirstat output for that commit in the following dirstat modes: - --dirstat - -X - --dirstat=0 - -X0 - --cumulative - --dirstat-by-file - (plus combinations of the above) Each of the above tests are also run with: - no rename detection - rename detection (-M) - expensive copy detection (-C -C) Improved-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johan Herland committed Apr 29, 2011 at 11:36 UTC 5502039d87337e076e69f7de949cb0e0360de16f
1 file changed +585
t/t4047-diff-dirstat.sh new
+585
@@ -0,0 +1,585 @@
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