t / t4041-diff-submodule.shon commit Merge branch 'maint' (b56735e)
   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 $head6..$head6-dirty:
 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 $head6..$head6-dirty:
 213EOF
 214"
 215
 216test_expect_success 'submodule contains modifed content' "
 217        rm -f sm1/new-file &&
 218        git diff-index -p --submodule=log HEAD >actual &&
 219        diff actual - <<-EOF
 220Submodule sm1 $head6..$head6-dirty:
 221EOF
 222"
 223
 224(cd sm1; git commit -mchange foo6 >/dev/null) &&
 225head8=$(cd sm1; git rev-parse --verify HEAD | cut -c1-7) &&
 226test_expect_success 'submodule is modified' "
 227        git diff-index -p --submodule=log HEAD >actual &&
 228        diff actual - <<-EOF
 229Submodule sm1 $head6..$head8:
 230  > change
 231EOF
 232"
 233
 234test_expect_success 'modified submodule contains untracked content' "
 235        echo new > sm1/new-file &&
 236        git diff-index -p --submodule=log HEAD >actual &&
 237        diff actual - <<-EOF
 238Submodule sm1 $head6..$head8-dirty:
 239  > change
 240EOF
 241"
 242
 243test_expect_success 'modified submodule contains untracked and modifed content' "
 244        echo modification >> sm1/foo6 &&
 245        git diff-index -p --submodule=log HEAD >actual &&
 246        diff actual - <<-EOF
 247Submodule sm1 $head6..$head8-dirty:
 248  > change
 249EOF
 250"
 251
 252test_expect_success 'modified submodule contains modifed content' "
 253        rm -f sm1/new-file &&
 254        git diff-index -p --submodule=log HEAD >actual &&
 255        diff actual - <<-EOF
 256Submodule sm1 $head6..$head8-dirty:
 257  > change
 258EOF
 259"
 260
 261rm -rf sm1
 262test_expect_success 'deleted submodule' "
 263        git diff-index -p --submodule=log HEAD >actual &&
 264        diff actual - <<-EOF
 265Submodule sm1 $head6...0000000 (submodule deleted)
 266EOF
 267"
 268
 269test_create_repo sm2 &&
 270head7=$(add_file sm2 foo8 foo9) &&
 271git add sm2
 272
 273test_expect_success 'multiple submodules' "
 274        git diff-index -p --submodule=log HEAD >actual &&
 275        diff actual - <<-EOF
 276Submodule sm1 $head6...0000000 (submodule deleted)
 277Submodule sm2 0000000...$head7 (new submodule)
 278EOF
 279"
 280
 281test_expect_success 'path filter' "
 282        git diff-index -p --submodule=log HEAD sm2 >actual &&
 283        diff actual - <<-EOF
 284Submodule sm2 0000000...$head7 (new submodule)
 285EOF
 286"
 287
 288commit_file sm2
 289test_expect_success 'given commit' "
 290        git diff-index -p --submodule=log HEAD^ >actual &&
 291        diff actual - <<-EOF
 292Submodule sm1 $head6...0000000 (submodule deleted)
 293Submodule sm2 0000000...$head7 (new submodule)
 294EOF
 295"
 296
 297test_expect_success 'given commit --submodule' "
 298        git diff-index -p --submodule HEAD^ >actual &&
 299        diff actual - <<-EOF
 300Submodule sm1 $head6...0000000 (submodule deleted)
 301Submodule sm2 0000000...$head7 (new submodule)
 302EOF
 303"
 304
 305fullhead7=$(cd sm2; git rev-list --max-count=1 $head7)
 306
 307test_expect_success 'given commit --submodule=short' "
 308        git diff-index -p --submodule=short HEAD^ >actual &&
 309        diff actual - <<-EOF
 310diff --git a/sm1 b/sm1
 311deleted file mode 160000
 312index $head6..0000000
 313--- a/sm1
 314+++ /dev/null
 315@@ -1 +0,0 @@
 316-Subproject commit $fullhead6
 317diff --git a/sm2 b/sm2
 318new file mode 160000
 319index 0000000..$head7
 320--- /dev/null
 321+++ b/sm2
 322@@ -0,0 +1 @@
 323+Subproject commit $fullhead7
 324EOF
 325"
 326
 327test_done