1c5adadf3266dab844bd7b9db97c76c9bb8b7804
   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
 354cat <<EOF >expect_diff_dirstat
 355   2.1% changed/
 356  10.8% dst/copy/changed/
 357  10.8% dst/copy/rearranged/
 358  10.8% dst/copy/unchanged/
 359  10.8% dst/move/changed/
 360  10.8% dst/move/rearranged/
 361  10.8% dst/move/unchanged/
 362   0.0% rearranged/
 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
 405cat <<EOF >expect_diff_dirstat
 406   2.1% changed/
 407  10.8% dst/copy/changed/
 408  10.8% dst/copy/rearranged/
 409  10.8% dst/copy/unchanged/
 410  32.5% dst/copy/
 411  10.8% dst/move/changed/
 412  10.8% dst/move/rearranged/
 413  10.8% dst/move/unchanged/
 414  32.5% dst/move/
 415  65.1% dst/
 416   0.0% rearranged/
 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