1bc6e77a0d5914a7cbf0986bdabc44697e334c27
   1#!/bin/sh
   2
   3test_description='difference in submodules'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY"/diff-lib.sh
   7
   8_z40=0000000000000000000000000000000000000000
   9test_expect_success setup '
  10        test_tick &&
  11        test_create_repo sub &&
  12        (
  13                cd sub &&
  14                echo hello >world &&
  15                git add world &&
  16                git commit -m submodule
  17        ) &&
  18
  19        test_tick &&
  20        echo frotz >nitfol &&
  21        git add nitfol sub &&
  22        git commit -m superproject &&
  23
  24        (
  25                cd sub &&
  26                echo goodbye >world &&
  27                git add world &&
  28                git commit -m "submodule #2"
  29        ) &&
  30
  31        set x $(
  32                cd sub &&
  33                git rev-list HEAD
  34        ) &&
  35        echo ":160000 160000 $3 $_z40 M sub" >expect &&
  36        subtip=$3 subprev=$2
  37'
  38
  39test_expect_success 'git diff --raw HEAD' '
  40        git diff --raw --abbrev=40 HEAD >actual &&
  41        test_cmp expect actual
  42'
  43
  44test_expect_success 'git diff-index --raw HEAD' '
  45        git diff-index --raw HEAD >actual.index &&
  46        test_cmp expect actual.index
  47'
  48
  49test_expect_success 'git diff-files --raw' '
  50        git diff-files --raw >actual.files &&
  51        test_cmp expect actual.files
  52'
  53
  54expect_from_to () {
  55        printf "%sSubproject commit %s\n+Subproject commit %s\n" \
  56                "-" "$1" "$2"
  57}
  58
  59test_expect_success 'git diff HEAD' '
  60        git diff HEAD >actual &&
  61        sed -e "1,/^@@/d" actual >actual.body &&
  62        expect_from_to >expect.body $subtip $subprev &&
  63        test_cmp expect.body actual.body
  64'
  65
  66test_expect_success 'git diff HEAD with dirty submodule (work tree)' '
  67        echo >>sub/world &&
  68        git diff HEAD >actual &&
  69        sed -e "1,/^@@/d" actual >actual.body &&
  70        expect_from_to >expect.body $subtip $subprev-dirty &&
  71        test_cmp expect.body actual.body
  72'
  73
  74test_expect_success 'git diff HEAD with dirty submodule (index)' '
  75        (
  76                cd sub &&
  77                git reset --hard &&
  78                echo >>world &&
  79                git add world
  80        ) &&
  81        git diff HEAD >actual &&
  82        sed -e "1,/^@@/d" actual >actual.body &&
  83        expect_from_to >expect.body $subtip $subprev-dirty &&
  84        test_cmp expect.body actual.body
  85'
  86
  87test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
  88        (
  89                cd sub &&
  90                git reset --hard &&
  91                git clean -qfdx &&
  92                >cruft
  93        ) &&
  94        git diff HEAD >actual &&
  95        sed -e "1,/^@@/d" actual >actual.body &&
  96        expect_from_to >expect.body $subtip $subprev-dirty &&
  97        test_cmp expect.body actual.body
  98'
  99
 100test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match)' '
 101        git commit -m "x" sub &&
 102        echo >>sub/world &&
 103        git diff HEAD >actual &&
 104        sed -e "1,/^@@/d" actual >actual.body &&
 105        expect_from_to >expect.body $subprev $subprev-dirty &&
 106        test_cmp expect.body actual.body &&
 107        git diff --ignore-submodules HEAD >actual2 &&
 108        ! test -s actual2 &&
 109        git diff --ignore-submodules=untracked HEAD >actual3 &&
 110        sed -e "1,/^@@/d" actual3 >actual3.body &&
 111        expect_from_to >expect.body $subprev $subprev-dirty &&
 112        test_cmp expect.body actual3.body &&
 113        git diff --ignore-submodules=dirty HEAD >actual4 &&
 114        ! test -s actual4
 115'
 116
 117test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.git/config]' '
 118        git config submodule.subname.ignore none &&
 119        git config submodule.subname.path sub &&
 120        git diff HEAD >actual &&
 121        sed -e "1,/^@@/d" actual >actual.body &&
 122        expect_from_to >expect.body $subprev $subprev-dirty &&
 123        test_cmp expect.body actual.body &&
 124        git config submodule.subname.ignore all &&
 125        git diff HEAD >actual2 &&
 126        ! test -s actual2 &&
 127        git config submodule.subname.ignore untracked &&
 128        git diff HEAD >actual3 &&
 129        sed -e "1,/^@@/d" actual3 >actual3.body &&
 130        expect_from_to >expect.body $subprev $subprev-dirty &&
 131        test_cmp expect.body actual3.body &&
 132        git config submodule.subname.ignore dirty &&
 133        git diff HEAD >actual4 &&
 134        ! test -s actual4 &&
 135        git diff HEAD --ignore-submodules=none >actual &&
 136        sed -e "1,/^@@/d" actual >actual.body &&
 137        expect_from_to >expect.body $subprev $subprev-dirty &&
 138        test_cmp expect.body actual.body &&
 139        git config --remove-section submodule.subname
 140'
 141
 142test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.gitmodules]' '
 143        git config --add -f .gitmodules submodule.subname.ignore none &&
 144        git config --add -f .gitmodules submodule.subname.path sub &&
 145        git diff HEAD >actual &&
 146        sed -e "1,/^@@/d" actual >actual.body &&
 147        expect_from_to >expect.body $subprev $subprev-dirty &&
 148        test_cmp expect.body actual.body &&
 149        git config -f .gitmodules submodule.subname.ignore all &&
 150        git config -f .gitmodules submodule.subname.path sub &&
 151        git diff HEAD >actual2 &&
 152        ! test -s actual2 &&
 153        git config -f .gitmodules submodule.subname.ignore untracked &&
 154        git diff HEAD >actual3 &&
 155        sed -e "1,/^@@/d" actual3 >actual3.body &&
 156        expect_from_to >expect.body $subprev $subprev-dirty &&
 157        test_cmp expect.body actual3.body &&
 158        git config -f .gitmodules submodule.subname.ignore dirty &&
 159        git diff HEAD >actual4 &&
 160        ! test -s actual4 &&
 161        git config submodule.subname.ignore none &&
 162        git config submodule.subname.path sub &&
 163        git diff HEAD >actual &&
 164        sed -e "1,/^@@/d" actual >actual.body &&
 165        expect_from_to >expect.body $subprev $subprev-dirty &&
 166        test_cmp expect.body actual.body &&
 167        git config --remove-section submodule.subname &&
 168        git config --remove-section -f .gitmodules submodule.subname &&
 169        rm .gitmodules
 170'
 171
 172test_expect_success 'git diff HEAD with dirty submodule (index, refs match)' '
 173        (
 174                cd sub &&
 175                git reset --hard &&
 176                echo >>world &&
 177                git add world
 178        ) &&
 179        git diff HEAD >actual &&
 180        sed -e "1,/^@@/d" actual >actual.body &&
 181        expect_from_to >expect.body $subprev $subprev-dirty &&
 182        test_cmp expect.body actual.body
 183'
 184
 185test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' '
 186        (
 187                cd sub &&
 188                git reset --hard &&
 189                git clean -qfdx &&
 190                >cruft
 191        ) &&
 192        git diff HEAD >actual &&
 193        sed -e "1,/^@@/d" actual >actual.body &&
 194        expect_from_to >expect.body $subprev $subprev-dirty &&
 195        test_cmp expect.body actual.body &&
 196        git diff --ignore-submodules=all HEAD >actual2 &&
 197        ! test -s actual2 &&
 198        git diff --ignore-submodules=untracked HEAD >actual3 &&
 199        ! test -s actual3 &&
 200        git diff --ignore-submodules=dirty HEAD >actual4 &&
 201        ! test -s actual4
 202'
 203
 204test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.git/config]' '
 205        git config submodule.subname.ignore all &&
 206        git config submodule.subname.path sub &&
 207        git diff HEAD >actual2 &&
 208        ! test -s actual2 &&
 209        git config submodule.subname.ignore untracked &&
 210        git diff HEAD >actual3 &&
 211        ! test -s actual3 &&
 212        git config submodule.subname.ignore dirty &&
 213        git diff HEAD >actual4 &&
 214        ! test -s actual4 &&
 215        git diff --ignore-submodules=none HEAD >actual &&
 216        sed -e "1,/^@@/d" actual >actual.body &&
 217        expect_from_to >expect.body $subprev $subprev-dirty &&
 218        test_cmp expect.body actual.body &&
 219        git config --remove-section submodule.subname
 220'
 221
 222test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.gitmodules]' '
 223        git config --add -f .gitmodules submodule.subname.ignore all &&
 224        git config --add -f .gitmodules submodule.subname.path sub &&
 225        git diff HEAD >actual2 &&
 226        ! test -s actual2 &&
 227        git config -f .gitmodules submodule.subname.ignore untracked &&
 228        git diff HEAD >actual3 &&
 229        ! test -s actual3 &&
 230        git config -f .gitmodules submodule.subname.ignore dirty &&
 231        git diff HEAD >actual4 &&
 232        ! test -s actual4 &&
 233        git config submodule.subname.ignore none &&
 234        git config submodule.subname.path sub &&
 235        git diff HEAD >actual &&
 236        sed -e "1,/^@@/d" actual >actual.body &&
 237        expect_from_to >expect.body $subprev $subprev-dirty &&
 238        test_cmp expect.body actual.body &&
 239        git config --remove-section submodule.subname &&
 240        git config --remove-section -f .gitmodules submodule.subname &&
 241        rm .gitmodules
 242'
 243
 244test_expect_success 'git diff between submodule commits' '
 245        git diff HEAD^..HEAD >actual &&
 246        sed -e "1,/^@@/d" actual >actual.body &&
 247        expect_from_to >expect.body $subtip $subprev &&
 248        test_cmp expect.body actual.body &&
 249        git diff --ignore-submodules=dirty HEAD^..HEAD >actual &&
 250        sed -e "1,/^@@/d" actual >actual.body &&
 251        expect_from_to >expect.body $subtip $subprev &&
 252        test_cmp expect.body actual.body &&
 253        git diff --ignore-submodules HEAD^..HEAD >actual &&
 254        ! test -s actual
 255'
 256
 257test_expect_success 'git diff between submodule commits [.git/config]' '
 258        git diff HEAD^..HEAD >actual &&
 259        sed -e "1,/^@@/d" actual >actual.body &&
 260        expect_from_to >expect.body $subtip $subprev &&
 261        test_cmp expect.body actual.body &&
 262        git config submodule.subname.ignore dirty &&
 263        git config submodule.subname.path sub &&
 264        git diff HEAD^..HEAD >actual &&
 265        sed -e "1,/^@@/d" actual >actual.body &&
 266        expect_from_to >expect.body $subtip $subprev &&
 267        test_cmp expect.body actual.body &&
 268        git config submodule.subname.ignore all &&
 269        git diff HEAD^..HEAD >actual &&
 270        ! test -s actual &&
 271        git diff --ignore-submodules=dirty HEAD^..HEAD >actual &&
 272        sed -e "1,/^@@/d" actual >actual.body &&
 273        expect_from_to >expect.body $subtip $subprev &&
 274        git config --remove-section submodule.subname
 275'
 276
 277test_expect_success 'git diff between submodule commits [.gitmodules]' '
 278        git diff HEAD^..HEAD >actual &&
 279        sed -e "1,/^@@/d" actual >actual.body &&
 280        expect_from_to >expect.body $subtip $subprev &&
 281        test_cmp expect.body actual.body &&
 282        git config --add -f .gitmodules submodule.subname.ignore dirty &&
 283        git config --add -f .gitmodules submodule.subname.path sub &&
 284        git diff HEAD^..HEAD >actual &&
 285        sed -e "1,/^@@/d" actual >actual.body &&
 286        expect_from_to >expect.body $subtip $subprev &&
 287        test_cmp expect.body actual.body &&
 288        git config -f .gitmodules submodule.subname.ignore all &&
 289        git diff HEAD^..HEAD >actual &&
 290        ! test -s actual &&
 291        git config submodule.subname.ignore dirty &&
 292        git config submodule.subname.path sub &&
 293        git diff  HEAD^..HEAD >actual &&
 294        sed -e "1,/^@@/d" actual >actual.body &&
 295        expect_from_to >expect.body $subtip $subprev &&
 296        git config --remove-section submodule.subname &&
 297        git config --remove-section -f .gitmodules submodule.subname &&
 298        rm .gitmodules
 299'
 300
 301test_expect_success 'git diff (empty submodule dir)' '
 302        : >empty &&
 303        rm -rf sub/* sub/.git &&
 304        git diff > actual.empty &&
 305        test_cmp empty actual.empty
 306'
 307
 308test_expect_success 'conflicted submodule setup' '
 309
 310        # 39 efs
 311        c=fffffffffffffffffffffffffffffffffffffff
 312        (
 313                echo "000000 $_z40 0    sub"
 314                echo "160000 1$c 1      sub"
 315                echo "160000 2$c 2      sub"
 316                echo "160000 3$c 3      sub"
 317        ) | git update-index --index-info &&
 318        echo >expect.nosub '\''diff --cc sub
 319index 2ffffff,3ffffff..0000000
 320--- a/sub
 321+++ b/sub
 322@@@ -1,1 -1,1 +1,1 @@@
 323- Subproject commit 2fffffffffffffffffffffffffffffffffffffff
 324 -Subproject commit 3fffffffffffffffffffffffffffffffffffffff
 325++Subproject commit 0000000000000000000000000000000000000000'\'' &&
 326
 327        hh=$(git rev-parse HEAD) &&
 328        sed -e "s/$_z40/$hh/" expect.nosub >expect.withsub
 329
 330'
 331
 332test_expect_success 'combined (empty submodule)' '
 333        rm -fr sub && mkdir sub &&
 334        git diff >actual &&
 335        test_cmp expect.nosub actual
 336'
 337
 338test_expect_success 'combined (with submodule)' '
 339        rm -fr sub &&
 340        git clone --no-checkout . sub &&
 341        git diff >actual &&
 342        test_cmp expect.withsub actual
 343'
 344
 345
 346
 347test_done