t / t4041-diff-submodule.shon commit Merge branch 'cc/cherry-pick-series' (8c7da86)
   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)
  36
  37test_expect_success 'added submodule' "
  38        git add sm1 &&
  39        git diff-index -p --submodule=log HEAD >actual &&
  40        diff actual - <<-EOF
  41Submodule sm1 0000000...$head1 (new submodule)
  42EOF
  43"
  44
  45commit_file sm1 &&
  46head2=$(add_file sm1 foo3)
  47
  48test_expect_success 'modified submodule(forward)' "
  49        git diff-index -p --submodule=log HEAD >actual &&
  50        diff actual - <<-EOF
  51Submodule sm1 $head1..$head2:
  52  > Add foo3
  53EOF
  54"
  55
  56test_expect_success 'modified submodule(forward)' "
  57        git diff --submodule=log >actual &&
  58        diff actual - <<-EOF
  59Submodule sm1 $head1..$head2:
  60  > Add foo3
  61EOF
  62"
  63
  64test_expect_success 'modified submodule(forward) --submodule' "
  65        git diff --submodule >actual &&
  66        diff actual - <<-EOF
  67Submodule sm1 $head1..$head2:
  68  > Add foo3
  69EOF
  70"
  71
  72fullhead1=$(cd sm1; git rev-list --max-count=1 $head1)
  73fullhead2=$(cd sm1; git rev-list --max-count=1 $head2)
  74test_expect_success 'modified submodule(forward) --submodule=short' "
  75        git diff --submodule=short >actual &&
  76        diff actual - <<-EOF
  77diff --git a/sm1 b/sm1
  78index $head1..$head2 160000
  79--- a/sm1
  80+++ b/sm1
  81@@ -1 +1 @@
  82-Subproject commit $fullhead1
  83+Subproject commit $fullhead2
  84EOF
  85"
  86
  87commit_file sm1 &&
  88cd sm1 &&
  89git reset --hard HEAD~2 >/dev/null &&
  90head3=$(git rev-parse --verify HEAD | cut -c1-7) &&
  91cd ..
  92
  93test_expect_success 'modified submodule(backward)' "
  94        git diff-index -p --submodule=log HEAD >actual &&
  95        diff actual - <<-EOF
  96Submodule sm1 $head2..$head3 (rewind):
  97  < Add foo3
  98  < Add foo2
  99EOF
 100"
 101
 102head4=$(add_file sm1 foo4 foo5) &&
 103head4_full=$(GIT_DIR=sm1/.git git rev-parse --verify HEAD)
 104test_expect_success 'modified submodule(backward and forward)' "
 105        git diff-index -p --submodule=log HEAD >actual &&
 106        diff actual - <<-EOF
 107Submodule sm1 $head2...$head4:
 108  > Add foo5
 109  > Add foo4
 110  < Add foo3
 111  < Add foo2
 112EOF
 113"
 114
 115commit_file sm1 &&
 116mv sm1 sm1-bak &&
 117echo sm1 >sm1 &&
 118head5=$(git hash-object sm1 | cut -c1-7) &&
 119git add sm1 &&
 120rm -f sm1 &&
 121mv sm1-bak sm1
 122
 123test_expect_success 'typechanged submodule(submodule->blob), --cached' "
 124        git diff --submodule=log --cached >actual &&
 125        diff actual - <<-EOF
 126Submodule sm1 41fbea9...0000000 (submodule deleted)
 127diff --git a/sm1 b/sm1
 128new file mode 100644
 129index 0000000..9da5fb8
 130--- /dev/null
 131+++ b/sm1
 132@@ -0,0 +1 @@
 133+sm1
 134EOF
 135"
 136
 137test_expect_success 'typechanged submodule(submodule->blob)' "
 138        git diff --submodule=log >actual &&
 139        diff actual - <<-EOF
 140diff --git a/sm1 b/sm1
 141deleted file mode 100644
 142index 9da5fb8..0000000
 143--- a/sm1
 144+++ /dev/null
 145@@ -1 +0,0 @@
 146-sm1
 147Submodule sm1 0000000...$head4 (new submodule)
 148EOF
 149"
 150
 151rm -rf sm1 &&
 152git checkout-index sm1
 153test_expect_success 'typechanged submodule(submodule->blob)' "
 154        git diff-index -p --submodule=log HEAD >actual &&
 155        diff actual - <<-EOF
 156Submodule sm1 $head4...0000000 (submodule deleted)
 157diff --git a/sm1 b/sm1
 158new file mode 100644
 159index 0000000..$head5
 160--- /dev/null
 161+++ b/sm1
 162@@ -0,0 +1 @@
 163+sm1
 164EOF
 165"
 166
 167rm -f sm1 &&
 168test_create_repo sm1 &&
 169head6=$(add_file sm1 foo6 foo7)
 170fullhead6=$(cd sm1; git rev-list --max-count=1 $head6)
 171test_expect_success 'nonexistent commit' "
 172        git diff-index -p --submodule=log HEAD >actual &&
 173        diff actual - <<-EOF
 174Submodule sm1 $head4...$head6 (commits not present)
 175EOF
 176"
 177
 178commit_file
 179test_expect_success 'typechanged submodule(blob->submodule)' "
 180        git diff-index -p --submodule=log HEAD >actual &&
 181        diff actual - <<-EOF
 182diff --git a/sm1 b/sm1
 183deleted file mode 100644
 184index $head5..0000000
 185--- a/sm1
 186+++ /dev/null
 187@@ -1 +0,0 @@
 188-sm1
 189Submodule sm1 0000000...$head6 (new submodule)
 190EOF
 191"
 192
 193commit_file sm1 &&
 194test_expect_success 'submodule is up to date' "
 195        git diff-index -p --submodule=log HEAD >actual &&
 196        diff actual - <<-EOF
 197EOF
 198"
 199
 200test_expect_success 'submodule contains untracked content' "
 201        echo new > sm1/new-file &&
 202        git diff-index -p --submodule=log HEAD >actual &&
 203        diff actual - <<-EOF
 204Submodule sm1 contains untracked content
 205EOF
 206"
 207
 208test_expect_success 'submodule contains untracked and modifed content' "
 209        echo new > sm1/foo6 &&
 210        git diff-index -p --submodule=log HEAD >actual &&
 211        diff actual - <<-EOF
 212Submodule sm1 contains untracked content
 213Submodule sm1 contains modified content
 214EOF
 215"
 216
 217test_expect_success 'submodule contains modifed content' "
 218        rm -f sm1/new-file &&
 219        git diff-index -p --submodule=log HEAD >actual &&
 220        diff actual - <<-EOF
 221Submodule sm1 contains modified content
 222EOF
 223"
 224
 225(cd sm1; git commit -mchange foo6 >/dev/null) &&
 226head8=$(cd sm1; git rev-parse --verify HEAD | cut -c1-7) &&
 227test_expect_success 'submodule is modified' "
 228        git diff-index -p --submodule=log HEAD >actual &&
 229        diff actual - <<-EOF
 230Submodule sm1 $head6..$head8:
 231  > change
 232EOF
 233"
 234
 235test_expect_success 'modified submodule contains untracked content' "
 236        echo new > sm1/new-file &&
 237        git diff-index -p --submodule=log HEAD >actual &&
 238        diff actual - <<-EOF
 239Submodule sm1 contains untracked content
 240Submodule sm1 $head6..$head8:
 241  > change
 242EOF
 243"
 244
 245test_expect_success 'modified submodule contains untracked and modifed content' "
 246        echo modification >> sm1/foo6 &&
 247        git diff-index -p --submodule=log HEAD >actual &&
 248        diff actual - <<-EOF
 249Submodule sm1 contains untracked content
 250Submodule sm1 contains modified content
 251Submodule sm1 $head6..$head8:
 252  > change
 253EOF
 254"
 255
 256test_expect_success 'modified submodule contains modifed content' "
 257        rm -f sm1/new-file &&
 258        git diff-index -p --submodule=log HEAD >actual &&
 259        diff actual - <<-EOF
 260Submodule sm1 contains modified content
 261Submodule sm1 $head6..$head8:
 262  > change
 263EOF
 264"
 265
 266rm -rf sm1
 267test_expect_success 'deleted submodule' "
 268        git diff-index -p --submodule=log HEAD >actual &&
 269        diff actual - <<-EOF
 270Submodule sm1 $head6...0000000 (submodule deleted)
 271EOF
 272"
 273
 274test_create_repo sm2 &&
 275head7=$(add_file sm2 foo8 foo9) &&
 276git add sm2
 277
 278test_expect_success 'multiple submodules' "
 279        git diff-index -p --submodule=log HEAD >actual &&
 280        diff actual - <<-EOF
 281Submodule sm1 $head6...0000000 (submodule deleted)
 282Submodule sm2 0000000...$head7 (new submodule)
 283EOF
 284"
 285
 286test_expect_success 'path filter' "
 287        git diff-index -p --submodule=log HEAD sm2 >actual &&
 288        diff actual - <<-EOF
 289Submodule sm2 0000000...$head7 (new submodule)
 290EOF
 291"
 292
 293commit_file sm2
 294test_expect_success 'given commit' "
 295        git diff-index -p --submodule=log HEAD^ >actual &&
 296        diff actual - <<-EOF
 297Submodule sm1 $head6...0000000 (submodule deleted)
 298Submodule sm2 0000000...$head7 (new submodule)
 299EOF
 300"
 301
 302test_expect_success 'given commit --submodule' "
 303        git diff-index -p --submodule HEAD^ >actual &&
 304        diff actual - <<-EOF
 305Submodule sm1 $head6...0000000 (submodule deleted)
 306Submodule sm2 0000000...$head7 (new submodule)
 307EOF
 308"
 309
 310fullhead7=$(cd sm2; git rev-list --max-count=1 $head7)
 311
 312test_expect_success 'given commit --submodule=short' "
 313        git diff-index -p --submodule=short HEAD^ >actual &&
 314        diff actual - <<-EOF
 315diff --git a/sm1 b/sm1
 316deleted file mode 160000
 317index $head6..0000000
 318--- a/sm1
 319+++ /dev/null
 320@@ -1 +0,0 @@
 321-Subproject commit $fullhead6
 322diff --git a/sm2 b/sm2
 323new file mode 160000
 324index 0000000..$head7
 325--- /dev/null
 326+++ b/sm2
 327@@ -0,0 +1 @@
 328+Subproject commit $fullhead7
 329EOF
 330"
 331
 332test_expect_success 'setup .git file for sm2' '
 333        (cd sm2 &&
 334         REAL="$(pwd)/../.real" &&
 335         mv .git "$REAL"
 336         echo "gitdir: $REAL" >.git)
 337'
 338
 339test_expect_success 'diff --submodule with .git file' '
 340        git diff --submodule HEAD^ >actual &&
 341        diff actual - <<-EOF
 342Submodule sm1 $head6...0000000 (submodule deleted)
 343Submodule sm2 0000000...$head7 (new submodule)
 344EOF
 345'
 346
 347test_done