t / t4060-diff-submodule-option-diff-format.shon commit Merge branch 'rs/wt-status-cleanup' (094aa09)
   1#!/bin/sh
   2#
   3# Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
   4# Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
   5# Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
   6#
   7
   8test_description='Support for diff format verbose submodule difference in git diff
   9
  10This test tries to verify the sanity of --submodule=diff option of git diff.
  11'
  12
  13. ./test-lib.sh
  14
  15# Tested non-UTF-8 encoding
  16test_encoding="ISO8859-1"
  17
  18# String "added" in German (translated with Google Translate), encoded in UTF-8,
  19# used in sample commit log messages in add_file() function below.
  20added=$(printf "hinzugef\303\274gt")
  21
  22add_file () {
  23        (
  24                cd "$1" &&
  25                shift &&
  26                for name
  27                do
  28                        echo "$name" >"$name" &&
  29                        git add "$name" &&
  30                        test_tick &&
  31                        # "git commit -m" would break MinGW, as Windows refuse to pass
  32                        # $test_encoding encoded parameter to git.
  33                        echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
  34                        git -c "i18n.commitEncoding=$test_encoding" commit -F -
  35                done >/dev/null &&
  36                git rev-parse --short --verify HEAD
  37        )
  38}
  39
  40commit_file () {
  41        test_tick &&
  42        git commit "$@" -m "Commit $*" >/dev/null
  43}
  44
  45test_expect_success 'setup repository' '
  46        test_create_repo sm1 &&
  47        add_file . foo &&
  48        head1=$(add_file sm1 foo1 foo2) &&
  49        fullhead1=$(git -C sm1 rev-parse --verify HEAD)
  50'
  51
  52test_expect_success 'added submodule' '
  53        git add sm1 &&
  54        git diff-index -p --submodule=diff HEAD >actual &&
  55        cat >expected <<-EOF &&
  56        Submodule sm1 0000000...$head1 (new submodule)
  57        diff --git a/sm1/foo1 b/sm1/foo1
  58        new file mode 100644
  59        index 0000000..1715acd
  60        --- /dev/null
  61        +++ b/sm1/foo1
  62        @@ -0,0 +1 @@
  63        +foo1
  64        diff --git a/sm1/foo2 b/sm1/foo2
  65        new file mode 100644
  66        index 0000000..54b060e
  67        --- /dev/null
  68        +++ b/sm1/foo2
  69        @@ -0,0 +1 @@
  70        +foo2
  71        EOF
  72        test_cmp expected actual
  73'
  74
  75test_expect_success 'added submodule, set diff.submodule' '
  76        test_config diff.submodule log &&
  77        git add sm1 &&
  78        git diff-index -p --submodule=diff HEAD >actual &&
  79        cat >expected <<-EOF &&
  80        Submodule sm1 0000000...$head1 (new submodule)
  81        diff --git a/sm1/foo1 b/sm1/foo1
  82        new file mode 100644
  83        index 0000000..1715acd
  84        --- /dev/null
  85        +++ b/sm1/foo1
  86        @@ -0,0 +1 @@
  87        +foo1
  88        diff --git a/sm1/foo2 b/sm1/foo2
  89        new file mode 100644
  90        index 0000000..54b060e
  91        --- /dev/null
  92        +++ b/sm1/foo2
  93        @@ -0,0 +1 @@
  94        +foo2
  95        EOF
  96        test_cmp expected actual
  97'
  98
  99test_expect_success '--submodule=short overrides diff.submodule' '
 100        test_config diff.submodule log &&
 101        git add sm1 &&
 102        git diff --submodule=short --cached >actual &&
 103        cat >expected <<-EOF &&
 104        diff --git a/sm1 b/sm1
 105        new file mode 160000
 106        index 0000000..$head1
 107        --- /dev/null
 108        +++ b/sm1
 109        @@ -0,0 +1 @@
 110        +Subproject commit $fullhead1
 111        EOF
 112        test_cmp expected actual
 113'
 114
 115test_expect_success 'diff.submodule does not affect plumbing' '
 116        test_config diff.submodule log &&
 117        git diff-index -p HEAD >actual &&
 118        cat >expected <<-EOF &&
 119        diff --git a/sm1 b/sm1
 120        new file mode 160000
 121        index 0000000..$head1
 122        --- /dev/null
 123        +++ b/sm1
 124        @@ -0,0 +1 @@
 125        +Subproject commit $fullhead1
 126        EOF
 127        test_cmp expected actual
 128'
 129
 130commit_file sm1 &&
 131head2=$(add_file sm1 foo3)
 132
 133test_expect_success 'modified submodule(forward)' '
 134        git diff-index -p --submodule=diff HEAD >actual &&
 135        cat >expected <<-EOF &&
 136        Submodule sm1 $head1..$head2:
 137        diff --git a/sm1/foo3 b/sm1/foo3
 138        new file mode 100644
 139        index 0000000..c1ec6c6
 140        --- /dev/null
 141        +++ b/sm1/foo3
 142        @@ -0,0 +1 @@
 143        +foo3
 144        EOF
 145        test_cmp expected actual
 146'
 147
 148test_expect_success 'modified submodule(forward)' '
 149        git diff --submodule=diff >actual &&
 150        cat >expected <<-EOF &&
 151        Submodule sm1 $head1..$head2:
 152        diff --git a/sm1/foo3 b/sm1/foo3
 153        new file mode 100644
 154        index 0000000..c1ec6c6
 155        --- /dev/null
 156        +++ b/sm1/foo3
 157        @@ -0,0 +1 @@
 158        +foo3
 159        EOF
 160        test_cmp expected actual
 161'
 162
 163test_expect_success 'modified submodule(forward) --submodule' '
 164        git diff --submodule >actual &&
 165        cat >expected <<-EOF &&
 166        Submodule sm1 $head1..$head2:
 167          > Add foo3 ($added foo3)
 168        EOF
 169        test_cmp expected actual
 170'
 171
 172fullhead2=$(cd sm1; git rev-parse --verify HEAD)
 173test_expect_success 'modified submodule(forward) --submodule=short' '
 174        git diff --submodule=short >actual &&
 175        cat >expected <<-EOF &&
 176        diff --git a/sm1 b/sm1
 177        index $head1..$head2 160000
 178        --- a/sm1
 179        +++ b/sm1
 180        @@ -1 +1 @@
 181        -Subproject commit $fullhead1
 182        +Subproject commit $fullhead2
 183        EOF
 184        test_cmp expected actual
 185'
 186
 187commit_file sm1 &&
 188head3=$(
 189        cd sm1 &&
 190        git reset --hard HEAD~2 >/dev/null &&
 191        git rev-parse --short --verify HEAD
 192)
 193
 194test_expect_success 'modified submodule(backward)' '
 195        git diff-index -p --submodule=diff HEAD >actual &&
 196        cat >expected <<-EOF &&
 197        Submodule sm1 $head2..$head3 (rewind):
 198        diff --git a/sm1/foo2 b/sm1/foo2
 199        deleted file mode 100644
 200        index 54b060e..0000000
 201        --- a/sm1/foo2
 202        +++ /dev/null
 203        @@ -1 +0,0 @@
 204        -foo2
 205        diff --git a/sm1/foo3 b/sm1/foo3
 206        deleted file mode 100644
 207        index c1ec6c6..0000000
 208        --- a/sm1/foo3
 209        +++ /dev/null
 210        @@ -1 +0,0 @@
 211        -foo3
 212        EOF
 213        test_cmp expected actual
 214'
 215
 216head4=$(add_file sm1 foo4 foo5)
 217test_expect_success 'modified submodule(backward and forward)' '
 218        git diff-index -p --submodule=diff HEAD >actual &&
 219        cat >expected <<-EOF &&
 220        Submodule sm1 $head2...$head4:
 221        diff --git a/sm1/foo2 b/sm1/foo2
 222        deleted file mode 100644
 223        index 54b060e..0000000
 224        --- a/sm1/foo2
 225        +++ /dev/null
 226        @@ -1 +0,0 @@
 227        -foo2
 228        diff --git a/sm1/foo3 b/sm1/foo3
 229        deleted file mode 100644
 230        index c1ec6c6..0000000
 231        --- a/sm1/foo3
 232        +++ /dev/null
 233        @@ -1 +0,0 @@
 234        -foo3
 235        diff --git a/sm1/foo4 b/sm1/foo4
 236        new file mode 100644
 237        index 0000000..a0016db
 238        --- /dev/null
 239        +++ b/sm1/foo4
 240        @@ -0,0 +1 @@
 241        +foo4
 242        diff --git a/sm1/foo5 b/sm1/foo5
 243        new file mode 100644
 244        index 0000000..d6f2413
 245        --- /dev/null
 246        +++ b/sm1/foo5
 247        @@ -0,0 +1 @@
 248        +foo5
 249        EOF
 250        test_cmp expected actual
 251'
 252
 253commit_file sm1 &&
 254mv sm1 sm1-bak &&
 255echo sm1 >sm1 &&
 256head5=$(git hash-object sm1 | cut -c1-7) &&
 257git add sm1 &&
 258rm -f sm1 &&
 259mv sm1-bak sm1
 260
 261test_expect_success 'typechanged submodule(submodule->blob), --cached' '
 262        git diff --submodule=diff --cached >actual &&
 263        cat >expected <<-EOF &&
 264        Submodule sm1 $head4...0000000 (submodule deleted)
 265        diff --git a/sm1/foo1 b/sm1/foo1
 266        deleted file mode 100644
 267        index 1715acd..0000000
 268        --- a/sm1/foo1
 269        +++ /dev/null
 270        @@ -1 +0,0 @@
 271        -foo1
 272        diff --git a/sm1/foo4 b/sm1/foo4
 273        deleted file mode 100644
 274        index a0016db..0000000
 275        --- a/sm1/foo4
 276        +++ /dev/null
 277        @@ -1 +0,0 @@
 278        -foo4
 279        diff --git a/sm1/foo5 b/sm1/foo5
 280        deleted file mode 100644
 281        index d6f2413..0000000
 282        --- a/sm1/foo5
 283        +++ /dev/null
 284        @@ -1 +0,0 @@
 285        -foo5
 286        diff --git a/sm1 b/sm1
 287        new file mode 100644
 288        index 0000000..9da5fb8
 289        --- /dev/null
 290        +++ b/sm1
 291        @@ -0,0 +1 @@
 292        +sm1
 293        EOF
 294        test_cmp expected actual
 295'
 296
 297test_expect_success 'typechanged submodule(submodule->blob)' '
 298        git diff --submodule=diff >actual &&
 299        cat >expected <<-EOF &&
 300        diff --git a/sm1 b/sm1
 301        deleted file mode 100644
 302        index 9da5fb8..0000000
 303        --- a/sm1
 304        +++ /dev/null
 305        @@ -1 +0,0 @@
 306        -sm1
 307        Submodule sm1 0000000...$head4 (new submodule)
 308        diff --git a/sm1/foo1 b/sm1/foo1
 309        new file mode 100644
 310        index 0000000..1715acd
 311        --- /dev/null
 312        +++ b/sm1/foo1
 313        @@ -0,0 +1 @@
 314        +foo1
 315        diff --git a/sm1/foo4 b/sm1/foo4
 316        new file mode 100644
 317        index 0000000..a0016db
 318        --- /dev/null
 319        +++ b/sm1/foo4
 320        @@ -0,0 +1 @@
 321        +foo4
 322        diff --git a/sm1/foo5 b/sm1/foo5
 323        new file mode 100644
 324        index 0000000..d6f2413
 325        --- /dev/null
 326        +++ b/sm1/foo5
 327        @@ -0,0 +1 @@
 328        +foo5
 329        EOF
 330        test_cmp expected actual
 331'
 332
 333rm -rf sm1 &&
 334git checkout-index sm1
 335test_expect_success 'typechanged submodule(submodule->blob)' '
 336        git diff-index -p --submodule=diff HEAD >actual &&
 337        cat >expected <<-EOF &&
 338        Submodule sm1 $head4...0000000 (submodule deleted)
 339        diff --git a/sm1 b/sm1
 340        new file mode 100644
 341        index 0000000..9da5fb8
 342        --- /dev/null
 343        +++ b/sm1
 344        @@ -0,0 +1 @@
 345        +sm1
 346        EOF
 347        test_cmp expected actual
 348'
 349
 350rm -f sm1 &&
 351test_create_repo sm1 &&
 352head6=$(add_file sm1 foo6 foo7)
 353fullhead6=$(cd sm1; git rev-parse --verify HEAD)
 354test_expect_success 'nonexistent commit' '
 355        git diff-index -p --submodule=diff HEAD >actual &&
 356        cat >expected <<-EOF &&
 357        Submodule sm1 $head4...$head6 (commits not present)
 358        EOF
 359        test_cmp expected actual
 360'
 361
 362commit_file
 363test_expect_success 'typechanged submodule(blob->submodule)' '
 364        git diff-index -p --submodule=diff HEAD >actual &&
 365        cat >expected <<-EOF &&
 366        diff --git a/sm1 b/sm1
 367        deleted file mode 100644
 368        index 9da5fb8..0000000
 369        --- a/sm1
 370        +++ /dev/null
 371        @@ -1 +0,0 @@
 372        -sm1
 373        Submodule sm1 0000000...$head6 (new submodule)
 374        diff --git a/sm1/foo6 b/sm1/foo6
 375        new file mode 100644
 376        index 0000000..462398b
 377        --- /dev/null
 378        +++ b/sm1/foo6
 379        @@ -0,0 +1 @@
 380        +foo6
 381        diff --git a/sm1/foo7 b/sm1/foo7
 382        new file mode 100644
 383        index 0000000..6e9262c
 384        --- /dev/null
 385        +++ b/sm1/foo7
 386        @@ -0,0 +1 @@
 387        +foo7
 388        EOF
 389        test_cmp expected actual
 390'
 391
 392commit_file sm1 &&
 393test_expect_success 'submodule is up to date' '
 394        git diff-index -p --submodule=diff HEAD >actual &&
 395        cat >expected <<-EOF &&
 396        EOF
 397        test_cmp expected actual
 398'
 399
 400test_expect_success 'submodule contains untracked content' '
 401        echo new > sm1/new-file &&
 402        git diff-index -p --submodule=diff HEAD >actual &&
 403        cat >expected <<-EOF &&
 404        Submodule sm1 contains untracked content
 405        EOF
 406        test_cmp expected actual
 407'
 408
 409test_expect_success 'submodule contains untracked content (untracked ignored)' '
 410        git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
 411        ! test -s actual
 412'
 413
 414test_expect_success 'submodule contains untracked content (dirty ignored)' '
 415        git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
 416        ! test -s actual
 417'
 418
 419test_expect_success 'submodule contains untracked content (all ignored)' '
 420        git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
 421        ! test -s actual
 422'
 423
 424test_expect_success 'submodule contains untracked and modified content' '
 425        echo new > sm1/foo6 &&
 426        git diff-index -p --submodule=diff HEAD >actual &&
 427        cat >expected <<-EOF &&
 428        Submodule sm1 contains untracked content
 429        Submodule sm1 contains modified content
 430        diff --git a/sm1/foo6 b/sm1/foo6
 431        index 462398b..3e75765 100644
 432        --- a/sm1/foo6
 433        +++ b/sm1/foo6
 434        @@ -1 +1 @@
 435        -foo6
 436        +new
 437        EOF
 438        test_cmp expected actual
 439'
 440
 441# NOT OK
 442test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
 443        echo new > sm1/foo6 &&
 444        git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
 445        cat >expected <<-EOF &&
 446        Submodule sm1 contains modified content
 447        diff --git a/sm1/foo6 b/sm1/foo6
 448        index 462398b..3e75765 100644
 449        --- a/sm1/foo6
 450        +++ b/sm1/foo6
 451        @@ -1 +1 @@
 452        -foo6
 453        +new
 454        EOF
 455        test_cmp expected actual
 456'
 457
 458test_expect_success 'submodule contains untracked and modified content (dirty ignored)' '
 459        echo new > sm1/foo6 &&
 460        git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
 461        ! test -s actual
 462'
 463
 464test_expect_success 'submodule contains untracked and modified content (all ignored)' '
 465        echo new > sm1/foo6 &&
 466        git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
 467        ! test -s actual
 468'
 469
 470test_expect_success 'submodule contains modified content' '
 471        rm -f sm1/new-file &&
 472        git diff-index -p --submodule=diff HEAD >actual &&
 473        cat >expected <<-EOF &&
 474        Submodule sm1 contains modified content
 475        diff --git a/sm1/foo6 b/sm1/foo6
 476        index 462398b..3e75765 100644
 477        --- a/sm1/foo6
 478        +++ b/sm1/foo6
 479        @@ -1 +1 @@
 480        -foo6
 481        +new
 482        EOF
 483        test_cmp expected actual
 484'
 485
 486(cd sm1; git commit -mchange foo6 >/dev/null) &&
 487head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
 488test_expect_success 'submodule is modified' '
 489        git diff-index -p --submodule=diff HEAD >actual &&
 490        cat >expected <<-EOF &&
 491        Submodule sm1 17243c9..$head8:
 492        diff --git a/sm1/foo6 b/sm1/foo6
 493        index 462398b..3e75765 100644
 494        --- a/sm1/foo6
 495        +++ b/sm1/foo6
 496        @@ -1 +1 @@
 497        -foo6
 498        +new
 499        EOF
 500        test_cmp expected actual
 501'
 502
 503test_expect_success 'modified submodule contains untracked content' '
 504        echo new > sm1/new-file &&
 505        git diff-index -p --submodule=diff HEAD >actual &&
 506        cat >expected <<-EOF &&
 507        Submodule sm1 contains untracked content
 508        Submodule sm1 17243c9..$head8:
 509        diff --git a/sm1/foo6 b/sm1/foo6
 510        index 462398b..3e75765 100644
 511        --- a/sm1/foo6
 512        +++ b/sm1/foo6
 513        @@ -1 +1 @@
 514        -foo6
 515        +new
 516        EOF
 517        test_cmp expected actual
 518'
 519
 520test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
 521        git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
 522        cat >expected <<-EOF &&
 523        Submodule sm1 17243c9..$head8:
 524        diff --git a/sm1/foo6 b/sm1/foo6
 525        index 462398b..3e75765 100644
 526        --- a/sm1/foo6
 527        +++ b/sm1/foo6
 528        @@ -1 +1 @@
 529        -foo6
 530        +new
 531        EOF
 532        test_cmp expected actual
 533'
 534
 535test_expect_success 'modified submodule contains untracked content (dirty ignored)' '
 536        git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
 537        cat >expected <<-EOF &&
 538        Submodule sm1 17243c9..cfce562:
 539        diff --git a/sm1/foo6 b/sm1/foo6
 540        index 462398b..3e75765 100644
 541        --- a/sm1/foo6
 542        +++ b/sm1/foo6
 543        @@ -1 +1 @@
 544        -foo6
 545        +new
 546        EOF
 547        test_cmp expected actual
 548'
 549
 550test_expect_success 'modified submodule contains untracked content (all ignored)' '
 551        git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
 552        ! test -s actual
 553'
 554
 555test_expect_success 'modified submodule contains untracked and modified content' '
 556        echo modification >> sm1/foo6 &&
 557        git diff-index -p --submodule=diff HEAD >actual &&
 558        cat >expected <<-EOF &&
 559        Submodule sm1 contains untracked content
 560        Submodule sm1 contains modified content
 561        Submodule sm1 17243c9..cfce562:
 562        diff --git a/sm1/foo6 b/sm1/foo6
 563        index 462398b..dfda541 100644
 564        --- a/sm1/foo6
 565        +++ b/sm1/foo6
 566        @@ -1 +1,2 @@
 567        -foo6
 568        +new
 569        +modification
 570        EOF
 571        test_cmp expected actual
 572'
 573
 574test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
 575        echo modification >> sm1/foo6 &&
 576        git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
 577        cat >expected <<-EOF &&
 578        Submodule sm1 contains modified content
 579        Submodule sm1 17243c9..cfce562:
 580        diff --git a/sm1/foo6 b/sm1/foo6
 581        index 462398b..e20e2d9 100644
 582        --- a/sm1/foo6
 583        +++ b/sm1/foo6
 584        @@ -1 +1,3 @@
 585        -foo6
 586        +new
 587        +modification
 588        +modification
 589        EOF
 590        test_cmp expected actual
 591'
 592
 593test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' '
 594        echo modification >> sm1/foo6 &&
 595        git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
 596        cat >expected <<-EOF &&
 597        Submodule sm1 17243c9..cfce562:
 598        diff --git a/sm1/foo6 b/sm1/foo6
 599        index 462398b..3e75765 100644
 600        --- a/sm1/foo6
 601        +++ b/sm1/foo6
 602        @@ -1 +1 @@
 603        -foo6
 604        +new
 605        EOF
 606        test_cmp expected actual
 607'
 608
 609test_expect_success 'modified submodule contains untracked and modified content (all ignored)' '
 610        echo modification >> sm1/foo6 &&
 611        git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
 612        ! test -s actual
 613'
 614
 615# NOT OK
 616test_expect_success 'modified submodule contains modified content' '
 617        rm -f sm1/new-file &&
 618        git diff-index -p --submodule=diff HEAD >actual &&
 619        cat >expected <<-EOF &&
 620        Submodule sm1 contains modified content
 621        Submodule sm1 17243c9..cfce562:
 622        diff --git a/sm1/foo6 b/sm1/foo6
 623        index 462398b..ac466ca 100644
 624        --- a/sm1/foo6
 625        +++ b/sm1/foo6
 626        @@ -1 +1,5 @@
 627        -foo6
 628        +new
 629        +modification
 630        +modification
 631        +modification
 632        +modification
 633        EOF
 634        test_cmp expected actual
 635'
 636
 637rm -rf sm1
 638test_expect_success 'deleted submodule' '
 639        git diff-index -p --submodule=diff HEAD >actual &&
 640        cat >expected <<-EOF &&
 641        Submodule sm1 17243c9...0000000 (submodule deleted)
 642        EOF
 643        test_cmp expected actual
 644'
 645
 646test_expect_success 'create second submodule' '
 647        test_create_repo sm2 &&
 648        head7=$(add_file sm2 foo8 foo9) &&
 649        git add sm2
 650'
 651
 652test_expect_success 'multiple submodules' '
 653        git diff-index -p --submodule=diff HEAD >actual &&
 654        cat >expected <<-EOF &&
 655        Submodule sm1 17243c9...0000000 (submodule deleted)
 656        Submodule sm2 0000000...a5a65c9 (new submodule)
 657        diff --git a/sm2/foo8 b/sm2/foo8
 658        new file mode 100644
 659        index 0000000..db9916b
 660        --- /dev/null
 661        +++ b/sm2/foo8
 662        @@ -0,0 +1 @@
 663        +foo8
 664        diff --git a/sm2/foo9 b/sm2/foo9
 665        new file mode 100644
 666        index 0000000..9c3b4f6
 667        --- /dev/null
 668        +++ b/sm2/foo9
 669        @@ -0,0 +1 @@
 670        +foo9
 671        EOF
 672        test_cmp expected actual
 673'
 674
 675test_expect_success 'path filter' '
 676        git diff-index -p --submodule=diff HEAD sm2 >actual &&
 677        cat >expected <<-EOF &&
 678        Submodule sm2 0000000...a5a65c9 (new submodule)
 679        diff --git a/sm2/foo8 b/sm2/foo8
 680        new file mode 100644
 681        index 0000000..db9916b
 682        --- /dev/null
 683        +++ b/sm2/foo8
 684        @@ -0,0 +1 @@
 685        +foo8
 686        diff --git a/sm2/foo9 b/sm2/foo9
 687        new file mode 100644
 688        index 0000000..9c3b4f6
 689        --- /dev/null
 690        +++ b/sm2/foo9
 691        @@ -0,0 +1 @@
 692        +foo9
 693        EOF
 694        test_cmp expected actual
 695'
 696
 697commit_file sm2
 698test_expect_success 'given commit' '
 699        git diff-index -p --submodule=diff HEAD^ >actual &&
 700        cat >expected <<-EOF &&
 701        Submodule sm1 17243c9...0000000 (submodule deleted)
 702        Submodule sm2 0000000...a5a65c9 (new submodule)
 703        diff --git a/sm2/foo8 b/sm2/foo8
 704        new file mode 100644
 705        index 0000000..db9916b
 706        --- /dev/null
 707        +++ b/sm2/foo8
 708        @@ -0,0 +1 @@
 709        +foo8
 710        diff --git a/sm2/foo9 b/sm2/foo9
 711        new file mode 100644
 712        index 0000000..9c3b4f6
 713        --- /dev/null
 714        +++ b/sm2/foo9
 715        @@ -0,0 +1 @@
 716        +foo9
 717        EOF
 718        test_cmp expected actual
 719'
 720
 721test_expect_success 'setup .git file for sm2' '
 722        (cd sm2 &&
 723         REAL="$(pwd)/../.real" &&
 724         mv .git "$REAL"
 725         echo "gitdir: $REAL" >.git)
 726'
 727
 728test_expect_success 'diff --submodule=diff with .git file' '
 729        git diff --submodule=diff HEAD^ >actual &&
 730        cat >expected <<-EOF &&
 731        Submodule sm1 17243c9...0000000 (submodule deleted)
 732        Submodule sm2 0000000...a5a65c9 (new submodule)
 733        diff --git a/sm2/foo8 b/sm2/foo8
 734        new file mode 100644
 735        index 0000000..db9916b
 736        --- /dev/null
 737        +++ b/sm2/foo8
 738        @@ -0,0 +1 @@
 739        +foo8
 740        diff --git a/sm2/foo9 b/sm2/foo9
 741        new file mode 100644
 742        index 0000000..9c3b4f6
 743        --- /dev/null
 744        +++ b/sm2/foo9
 745        @@ -0,0 +1 @@
 746        +foo9
 747        EOF
 748        test_cmp expected actual
 749'
 750
 751test_expect_success 'setup nested submodule' '
 752        git submodule add -f ./sm2 &&
 753        git commit -a -m "add sm2" &&
 754        git -C sm2 submodule add ../sm2 nested &&
 755        git -C sm2 commit -a -m "nested sub"
 756'
 757
 758test_expect_success 'move nested submodule HEAD' '
 759        echo "nested content" >sm2/nested/file &&
 760        git -C sm2/nested add file &&
 761        git -C sm2/nested commit --allow-empty -m "new HEAD"
 762'
 763
 764test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '
 765        cat >expected <<-EOF &&
 766        Submodule nested a5a65c9..b55928c:
 767        diff --git a/nested/file b/nested/file
 768        new file mode 100644
 769        index 0000000..ca281f5
 770        --- /dev/null
 771        +++ b/nested/file
 772        @@ -0,0 +1 @@
 773        +nested content
 774        EOF
 775        git -C sm2 diff --submodule=diff >actual 2>err &&
 776        test_must_be_empty err &&
 777        test_cmp expected actual
 778'
 779
 780test_expect_success 'diff --submodule=diff recurses into nested submodules' '
 781        cat >expected <<-EOF &&
 782        Submodule sm2 contains modified content
 783        Submodule sm2 a5a65c9..280969a:
 784        diff --git a/sm2/.gitmodules b/sm2/.gitmodules
 785        new file mode 100644
 786        index 0000000..3a816b8
 787        --- /dev/null
 788        +++ b/sm2/.gitmodules
 789        @@ -0,0 +1,3 @@
 790        +[submodule "nested"]
 791        +       path = nested
 792        +       url = ../sm2
 793        Submodule nested 0000000...b55928c (new submodule)
 794        diff --git a/sm2/nested/file b/sm2/nested/file
 795        new file mode 100644
 796        index 0000000..ca281f5
 797        --- /dev/null
 798        +++ b/sm2/nested/file
 799        @@ -0,0 +1 @@
 800        +nested content
 801        diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
 802        new file mode 100644
 803        index 0000000..db9916b
 804        --- /dev/null
 805        +++ b/sm2/nested/foo8
 806        @@ -0,0 +1 @@
 807        +foo8
 808        diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
 809        new file mode 100644
 810        index 0000000..9c3b4f6
 811        --- /dev/null
 812        +++ b/sm2/nested/foo9
 813        @@ -0,0 +1 @@
 814        +foo9
 815        EOF
 816        git diff --submodule=diff >actual 2>err &&
 817        test_must_be_empty err &&
 818        test_cmp expected actual
 819'
 820
 821test_done