t / t4041-diff-submodule-option.shon commit diff: introduce diff.submodule configuration variable (c47ef57)
   1#!/bin/sh
   2#
   3# Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
   4#
   5
   6test_description='Support for verbose submodule differences in git diff
   7
   8This test tries to verify the sanity of the --submodule option of git diff.
   9'
  10
  11. ./test-lib.sh
  12
  13add_file () {
  14        sm=$1
  15        shift
  16        owd=$(pwd)
  17        cd "$sm"
  18        for name; do
  19                echo "$name" > "$name" &&
  20                git add "$name" &&
  21                test_tick &&
  22                git commit -m "Add $name"
  23        done >/dev/null
  24        git rev-parse --verify HEAD | cut -c1-7
  25        cd "$owd"
  26}
  27commit_file () {
  28        test_tick &&
  29        git commit "$@" -m "Commit $*" >/dev/null
  30}
  31
  32test_create_repo sm1 &&
  33add_file . foo >/dev/null
  34
  35head1=$(add_file sm1 foo1 foo2)
  36fullhead1=$(cd sm1; git rev-list --max-count=1 $head1)
  37
  38test_expect_success 'added submodule' "
  39        git add sm1 &&
  40        git diff-index -p --submodule=log HEAD >actual &&
  41        cat >expected <<-EOF &&
  42Submodule sm1 0000000...$head1 (new submodule)
  43EOF
  44        test_cmp expected actual
  45"
  46
  47test_expect_success 'added submodule, set diff.submodule' "
  48        git config diff.submodule log &&
  49        git add sm1 &&
  50        git diff --cached >actual &&
  51        cat >expected <<-EOF &&
  52Submodule sm1 0000000...$head1 (new submodule)
  53EOF
  54        git config --unset diff.submodule &&
  55        test_cmp expected actual
  56"
  57
  58test_expect_success '--submodule=short overrides diff.submodule' "
  59        test_config diff.submodule log &&
  60        git add sm1 &&
  61        git diff --submodule=short --cached >actual &&
  62        cat >expected <<-EOF &&
  63diff --git a/sm1 b/sm1
  64new file mode 160000
  65index 0000000..a2c4dab
  66--- /dev/null
  67+++ b/sm1
  68@@ -0,0 +1 @@
  69+Subproject commit $fullhead1
  70EOF
  71        test_cmp expected actual
  72"
  73
  74commit_file sm1 &&
  75head2=$(add_file sm1 foo3)
  76
  77test_expect_success 'modified submodule(forward)' "
  78        git diff-index -p --submodule=log HEAD >actual &&
  79        cat >expected <<-EOF &&
  80Submodule sm1 $head1..$head2:
  81  > Add foo3
  82EOF
  83        test_cmp expected actual
  84"
  85
  86test_expect_success 'modified submodule(forward)' "
  87        git diff --submodule=log >actual &&
  88        cat >expected <<-EOF &&
  89Submodule sm1 $head1..$head2:
  90  > Add foo3
  91EOF
  92        test_cmp expected actual
  93"
  94
  95test_expect_success 'modified submodule(forward) --submodule' "
  96        git diff --submodule >actual &&
  97        cat >expected <<-EOF &&
  98Submodule sm1 $head1..$head2:
  99  > Add foo3
 100EOF
 101        test_cmp expected actual
 102"
 103
 104fullhead2=$(cd sm1; git rev-list --max-count=1 $head2)
 105test_expect_success 'modified submodule(forward) --submodule=short' "
 106        git diff --submodule=short >actual &&
 107        cat >expected <<-EOF &&
 108diff --git a/sm1 b/sm1
 109index $head1..$head2 160000
 110--- a/sm1
 111+++ b/sm1
 112@@ -1 +1 @@
 113-Subproject commit $fullhead1
 114+Subproject commit $fullhead2
 115EOF
 116        test_cmp expected actual
 117"
 118
 119commit_file sm1 &&
 120head3=$(
 121        cd sm1 &&
 122        git reset --hard HEAD~2 >/dev/null &&
 123        git rev-parse --verify HEAD | cut -c1-7
 124)
 125
 126test_expect_success 'modified submodule(backward)' "
 127        git diff-index -p --submodule=log HEAD >actual &&
 128        cat >expected <<-EOF &&
 129Submodule sm1 $head2..$head3 (rewind):
 130  < Add foo3
 131  < Add foo2
 132EOF
 133        test_cmp expected actual
 134"
 135
 136head4=$(add_file sm1 foo4 foo5) &&
 137head4_full=$(GIT_DIR=sm1/.git git rev-parse --verify HEAD)
 138test_expect_success 'modified submodule(backward and forward)' "
 139        git diff-index -p --submodule=log HEAD >actual &&
 140        cat >expected <<-EOF &&
 141Submodule sm1 $head2...$head4:
 142  > Add foo5
 143  > Add foo4
 144  < Add foo3
 145  < Add foo2
 146EOF
 147        test_cmp expected actual
 148"
 149
 150commit_file sm1 &&
 151mv sm1 sm1-bak &&
 152echo sm1 >sm1 &&
 153head5=$(git hash-object sm1 | cut -c1-7) &&
 154git add sm1 &&
 155rm -f sm1 &&
 156mv sm1-bak sm1
 157
 158test_expect_success 'typechanged submodule(submodule->blob), --cached' "
 159        git diff --submodule=log --cached >actual &&
 160        cat >expected <<-EOF &&
 161Submodule sm1 41fbea9...0000000 (submodule deleted)
 162diff --git a/sm1 b/sm1
 163new file mode 100644
 164index 0000000..9da5fb8
 165--- /dev/null
 166+++ b/sm1
 167@@ -0,0 +1 @@
 168+sm1
 169EOF
 170        test_cmp expected actual
 171"
 172
 173test_expect_success 'typechanged submodule(submodule->blob)' "
 174        git diff --submodule=log >actual &&
 175        cat >expected <<-EOF &&
 176diff --git a/sm1 b/sm1
 177deleted file mode 100644
 178index 9da5fb8..0000000
 179--- a/sm1
 180+++ /dev/null
 181@@ -1 +0,0 @@
 182-sm1
 183Submodule sm1 0000000...$head4 (new submodule)
 184EOF
 185        test_cmp expected actual
 186"
 187
 188rm -rf sm1 &&
 189git checkout-index sm1
 190test_expect_success 'typechanged submodule(submodule->blob)' "
 191        git diff-index -p --submodule=log HEAD >actual &&
 192        cat >expected <<-EOF &&
 193Submodule sm1 $head4...0000000 (submodule deleted)
 194diff --git a/sm1 b/sm1
 195new file mode 100644
 196index 0000000..$head5
 197--- /dev/null
 198+++ b/sm1
 199@@ -0,0 +1 @@
 200+sm1
 201EOF
 202        test_cmp expected actual
 203"
 204
 205rm -f sm1 &&
 206test_create_repo sm1 &&
 207head6=$(add_file sm1 foo6 foo7)
 208fullhead6=$(cd sm1; git rev-list --max-count=1 $head6)
 209test_expect_success 'nonexistent commit' "
 210        git diff-index -p --submodule=log HEAD >actual &&
 211        cat >expected <<-EOF &&
 212Submodule sm1 $head4...$head6 (commits not present)
 213EOF
 214        test_cmp expected actual
 215"
 216
 217commit_file
 218test_expect_success 'typechanged submodule(blob->submodule)' "
 219        git diff-index -p --submodule=log HEAD >actual &&
 220        cat >expected <<-EOF &&
 221diff --git a/sm1 b/sm1
 222deleted file mode 100644
 223index $head5..0000000
 224--- a/sm1
 225+++ /dev/null
 226@@ -1 +0,0 @@
 227-sm1
 228Submodule sm1 0000000...$head6 (new submodule)
 229EOF
 230        test_cmp expected actual
 231"
 232
 233commit_file sm1 &&
 234test_expect_success 'submodule is up to date' "
 235        git diff-index -p --submodule=log HEAD >actual &&
 236        cat >expected <<-EOF &&
 237EOF
 238        test_cmp expected actual
 239"
 240
 241test_expect_success 'submodule contains untracked content' "
 242        echo new > sm1/new-file &&
 243        git diff-index -p --submodule=log HEAD >actual &&
 244        cat >expected <<-EOF &&
 245Submodule sm1 contains untracked content
 246EOF
 247        test_cmp expected actual
 248"
 249
 250test_expect_success 'submodule contains untracked content (untracked ignored)' "
 251        git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
 252        ! test -s actual
 253"
 254
 255test_expect_success 'submodule contains untracked content (dirty ignored)' "
 256        git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
 257        ! test -s actual
 258"
 259
 260test_expect_success 'submodule contains untracked content (all ignored)' "
 261        git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
 262        ! test -s actual
 263"
 264
 265test_expect_success 'submodule contains untracked and modifed content' "
 266        echo new > sm1/foo6 &&
 267        git diff-index -p --submodule=log HEAD >actual &&
 268        cat >expected <<-EOF &&
 269Submodule sm1 contains untracked content
 270Submodule sm1 contains modified content
 271EOF
 272        test_cmp expected actual
 273"
 274
 275test_expect_success 'submodule contains untracked and modifed content (untracked ignored)' "
 276        echo new > sm1/foo6 &&
 277        git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
 278        cat >expected <<-EOF &&
 279Submodule sm1 contains modified content
 280EOF
 281        test_cmp expected actual
 282"
 283
 284test_expect_success 'submodule contains untracked and modifed content (dirty ignored)' "
 285        echo new > sm1/foo6 &&
 286        git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
 287        ! test -s actual
 288"
 289
 290test_expect_success 'submodule contains untracked and modifed content (all ignored)' "
 291        echo new > sm1/foo6 &&
 292        git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
 293        ! test -s actual
 294"
 295
 296test_expect_success 'submodule contains modifed content' "
 297        rm -f sm1/new-file &&
 298        git diff-index -p --submodule=log HEAD >actual &&
 299        cat >expected <<-EOF &&
 300Submodule sm1 contains modified content
 301EOF
 302        test_cmp expected actual
 303"
 304
 305(cd sm1; git commit -mchange foo6 >/dev/null) &&
 306head8=$(cd sm1; git rev-parse --verify HEAD | cut -c1-7) &&
 307test_expect_success 'submodule is modified' "
 308        git diff-index -p --submodule=log HEAD >actual &&
 309        cat >expected <<-EOF &&
 310Submodule sm1 $head6..$head8:
 311  > change
 312EOF
 313        test_cmp expected actual
 314"
 315
 316test_expect_success 'modified submodule contains untracked content' "
 317        echo new > sm1/new-file &&
 318        git diff-index -p --submodule=log HEAD >actual &&
 319        cat >expected <<-EOF &&
 320Submodule sm1 contains untracked content
 321Submodule sm1 $head6..$head8:
 322  > change
 323EOF
 324        test_cmp expected actual
 325"
 326
 327test_expect_success 'modified submodule contains untracked content (untracked ignored)' "
 328        git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
 329        cat >expected <<-EOF &&
 330Submodule sm1 $head6..$head8:
 331  > change
 332EOF
 333        test_cmp expected actual
 334"
 335
 336test_expect_success 'modified submodule contains untracked content (dirty ignored)' "
 337        git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
 338        cat >expected <<-EOF &&
 339Submodule sm1 $head6..$head8:
 340  > change
 341EOF
 342        test_cmp expected actual
 343"
 344
 345test_expect_success 'modified submodule contains untracked content (all ignored)' "
 346        git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
 347        ! test -s actual
 348"
 349
 350test_expect_success 'modified submodule contains untracked and modifed content' "
 351        echo modification >> sm1/foo6 &&
 352        git diff-index -p --submodule=log HEAD >actual &&
 353        cat >expected <<-EOF &&
 354Submodule sm1 contains untracked content
 355Submodule sm1 contains modified content
 356Submodule sm1 $head6..$head8:
 357  > change
 358EOF
 359        test_cmp expected actual
 360"
 361
 362test_expect_success 'modified submodule contains untracked and modifed content (untracked ignored)' "
 363        echo modification >> sm1/foo6 &&
 364        git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
 365        cat >expected <<-EOF &&
 366Submodule sm1 contains modified content
 367Submodule sm1 $head6..$head8:
 368  > change
 369EOF
 370        test_cmp expected actual
 371"
 372
 373test_expect_success 'modified submodule contains untracked and modifed content (dirty ignored)' "
 374        echo modification >> sm1/foo6 &&
 375        git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
 376        cat >expected <<-EOF &&
 377Submodule sm1 $head6..$head8:
 378  > change
 379EOF
 380        test_cmp expected actual
 381"
 382
 383test_expect_success 'modified submodule contains untracked and modifed content (all ignored)' "
 384        echo modification >> sm1/foo6 &&
 385        git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
 386        ! test -s actual
 387"
 388
 389test_expect_success 'modified submodule contains modifed content' "
 390        rm -f sm1/new-file &&
 391        git diff-index -p --submodule=log HEAD >actual &&
 392        cat >expected <<-EOF &&
 393Submodule sm1 contains modified content
 394Submodule sm1 $head6..$head8:
 395  > change
 396EOF
 397        test_cmp expected actual
 398"
 399
 400rm -rf sm1
 401test_expect_success 'deleted submodule' "
 402        git diff-index -p --submodule=log HEAD >actual &&
 403        cat >expected <<-EOF &&
 404Submodule sm1 $head6...0000000 (submodule deleted)
 405EOF
 406        test_cmp expected actual
 407"
 408
 409test_create_repo sm2 &&
 410head7=$(add_file sm2 foo8 foo9) &&
 411git add sm2
 412
 413test_expect_success 'multiple submodules' "
 414        git diff-index -p --submodule=log HEAD >actual &&
 415        cat >expected <<-EOF &&
 416Submodule sm1 $head6...0000000 (submodule deleted)
 417Submodule sm2 0000000...$head7 (new submodule)
 418EOF
 419        test_cmp expected actual
 420"
 421
 422test_expect_success 'path filter' "
 423        git diff-index -p --submodule=log HEAD sm2 >actual &&
 424        cat >expected <<-EOF &&
 425Submodule sm2 0000000...$head7 (new submodule)
 426EOF
 427        test_cmp expected actual
 428"
 429
 430commit_file sm2
 431test_expect_success 'given commit' "
 432        git diff-index -p --submodule=log HEAD^ >actual &&
 433        cat >expected <<-EOF &&
 434Submodule sm1 $head6...0000000 (submodule deleted)
 435Submodule sm2 0000000...$head7 (new submodule)
 436EOF
 437        test_cmp expected actual
 438"
 439
 440test_expect_success 'given commit --submodule' "
 441        git diff-index -p --submodule HEAD^ >actual &&
 442        cat >expected <<-EOF &&
 443Submodule sm1 $head6...0000000 (submodule deleted)
 444Submodule sm2 0000000...$head7 (new submodule)
 445EOF
 446        test_cmp expected actual
 447"
 448
 449fullhead7=$(cd sm2; git rev-list --max-count=1 $head7)
 450
 451test_expect_success 'given commit --submodule=short' "
 452        git diff-index -p --submodule=short HEAD^ >actual &&
 453        cat >expected <<-EOF &&
 454diff --git a/sm1 b/sm1
 455deleted file mode 160000
 456index $head6..0000000
 457--- a/sm1
 458+++ /dev/null
 459@@ -1 +0,0 @@
 460-Subproject commit $fullhead6
 461diff --git a/sm2 b/sm2
 462new file mode 160000
 463index 0000000..$head7
 464--- /dev/null
 465+++ b/sm2
 466@@ -0,0 +1 @@
 467+Subproject commit $fullhead7
 468EOF
 469        test_cmp expected actual
 470"
 471
 472test_expect_success 'setup .git file for sm2' '
 473        (cd sm2 &&
 474         REAL="$(pwd)/../.real" &&
 475         mv .git "$REAL"
 476         echo "gitdir: $REAL" >.git)
 477'
 478
 479test_expect_success 'diff --submodule with .git file' '
 480        git diff --submodule HEAD^ >actual &&
 481        cat >expected <<-EOF &&
 482Submodule sm1 $head6...0000000 (submodule deleted)
 483Submodule sm2 0000000...$head7 (new submodule)
 484EOF
 485        test_cmp expected actual
 486'
 487
 488test_expect_success 'diff --submodule with objects referenced by alternates' '
 489        mkdir sub_alt &&
 490        (cd sub_alt &&
 491                git init &&
 492                echo a >a &&
 493                git add a &&
 494                git commit -m a
 495        ) &&
 496        mkdir super &&
 497        (cd super &&
 498                git clone -s ../sub_alt sub &&
 499                git init &&
 500                git add sub &&
 501                git commit -m "sub a"
 502        ) &&
 503        (cd sub_alt &&
 504                sha1_before=$(git rev-parse --short HEAD)
 505                echo b >b &&
 506                git add b &&
 507                git commit -m b
 508                sha1_after=$(git rev-parse --short HEAD)
 509                echo "Submodule sub $sha1_before..$sha1_after:
 510  > b" >../expected
 511        ) &&
 512        (cd super &&
 513                (cd sub &&
 514                        git fetch &&
 515                        git checkout origin/master
 516                ) &&
 517                git diff --submodule > ../actual
 518        )
 519        test_cmp expected actual
 520'
 521
 522test_done