t / t3007-ls-files-recurse-submodules.shon commit Merge branch 'jh/verify-index-checksum-only-in-fsck' (9b66978)
   1#!/bin/sh
   2
   3test_description='Test ls-files recurse-submodules feature
   4
   5This test verifies the recurse-submodules feature correctly lists files from
   6submodules.
   7'
   8
   9. ./test-lib.sh
  10
  11test_expect_success 'setup directory structure and submodules' '
  12        echo a >a &&
  13        mkdir b &&
  14        echo b >b/b &&
  15        git add a b &&
  16        git commit -m "add a and b" &&
  17        git init submodule &&
  18        echo c >submodule/c &&
  19        git -C submodule add c &&
  20        git -C submodule commit -m "add c" &&
  21        git submodule add ./submodule &&
  22        git commit -m "added submodule"
  23'
  24
  25test_expect_success 'ls-files correctly outputs files in submodule' '
  26        cat >expect <<-\EOF &&
  27        .gitmodules
  28        a
  29        b/b
  30        submodule/c
  31        EOF
  32
  33        git ls-files --recurse-submodules >actual &&
  34        test_cmp expect actual
  35'
  36
  37test_expect_success 'ls-files correctly outputs files in submodule with -z' '
  38        lf_to_nul >expect <<-\EOF &&
  39        .gitmodules
  40        a
  41        b/b
  42        submodule/c
  43        EOF
  44
  45        git ls-files --recurse-submodules -z >actual &&
  46        test_cmp expect actual
  47'
  48
  49test_expect_success 'ls-files does not output files not added to a repo' '
  50        cat >expect <<-\EOF &&
  51        .gitmodules
  52        a
  53        b/b
  54        submodule/c
  55        EOF
  56
  57        echo a >not_added &&
  58        echo b >b/not_added &&
  59        echo c >submodule/not_added &&
  60        git ls-files --recurse-submodules >actual &&
  61        test_cmp expect actual
  62'
  63
  64test_expect_success 'ls-files recurses more than 1 level' '
  65        cat >expect <<-\EOF &&
  66        .gitmodules
  67        a
  68        b/b
  69        submodule/.gitmodules
  70        submodule/c
  71        submodule/subsub/d
  72        EOF
  73
  74        git init submodule/subsub &&
  75        echo d >submodule/subsub/d &&
  76        git -C submodule/subsub add d &&
  77        git -C submodule/subsub commit -m "add d" &&
  78        git -C submodule submodule add ./subsub &&
  79        git -C submodule commit -m "added subsub" &&
  80        git submodule absorbgitdirs &&
  81        git ls-files --recurse-submodules >actual &&
  82        test_cmp expect actual
  83'
  84
  85test_expect_success 'ls-files works with GIT_DIR' '
  86        cat >expect <<-\EOF &&
  87        .gitmodules
  88        c
  89        subsub/d
  90        EOF
  91
  92        git --git-dir=submodule/.git ls-files --recurse-submodules >actual &&
  93        test_cmp expect actual
  94'
  95
  96test_expect_success '--recurse-submodules and pathspecs setup' '
  97        echo e >submodule/subsub/e.txt &&
  98        git -C submodule/subsub add e.txt &&
  99        git -C submodule/subsub commit -m "adding e.txt" &&
 100        echo f >submodule/f.TXT &&
 101        echo g >submodule/g.txt &&
 102        git -C submodule add f.TXT g.txt &&
 103        git -C submodule commit -m "add f and g" &&
 104        echo h >h.txt &&
 105        mkdir sib &&
 106        echo sib >sib/file &&
 107        git add h.txt sib/file &&
 108        git commit -m "add h and sib/file" &&
 109        git init sub &&
 110        echo sub >sub/file &&
 111        git -C sub add file &&
 112        git -C sub commit -m "add file" &&
 113        git submodule add ./sub &&
 114        git commit -m "added sub" &&
 115
 116        cat >expect <<-\EOF &&
 117        .gitmodules
 118        a
 119        b/b
 120        h.txt
 121        sib/file
 122        sub/file
 123        submodule/.gitmodules
 124        submodule/c
 125        submodule/f.TXT
 126        submodule/g.txt
 127        submodule/subsub/d
 128        submodule/subsub/e.txt
 129        EOF
 130
 131        git ls-files --recurse-submodules >actual &&
 132        test_cmp expect actual &&
 133        cat actual &&
 134        git ls-files --recurse-submodules "*" >actual &&
 135        test_cmp expect actual
 136'
 137
 138test_expect_success '--recurse-submodules and pathspecs' '
 139        cat >expect <<-\EOF &&
 140        h.txt
 141        submodule/g.txt
 142        submodule/subsub/e.txt
 143        EOF
 144
 145        git ls-files --recurse-submodules "*.txt" >actual &&
 146        test_cmp expect actual
 147'
 148
 149test_expect_success '--recurse-submodules and pathspecs' '
 150        cat >expect <<-\EOF &&
 151        h.txt
 152        submodule/f.TXT
 153        submodule/g.txt
 154        submodule/subsub/e.txt
 155        EOF
 156
 157        git ls-files --recurse-submodules ":(icase)*.txt" >actual &&
 158        test_cmp expect actual
 159'
 160
 161test_expect_success '--recurse-submodules and pathspecs' '
 162        cat >expect <<-\EOF &&
 163        h.txt
 164        submodule/f.TXT
 165        submodule/g.txt
 166        EOF
 167
 168        git ls-files --recurse-submodules ":(icase)*.txt" ":(exclude)submodule/subsub/*" >actual &&
 169        test_cmp expect actual
 170'
 171
 172test_expect_success '--recurse-submodules and pathspecs' '
 173        cat >expect <<-\EOF &&
 174        sub/file
 175        EOF
 176
 177        git ls-files --recurse-submodules "sub" >actual &&
 178        test_cmp expect actual &&
 179        git ls-files --recurse-submodules "sub/" >actual &&
 180        test_cmp expect actual &&
 181        git ls-files --recurse-submodules "sub/file" >actual &&
 182        test_cmp expect actual &&
 183        git ls-files --recurse-submodules "su*/file" >actual &&
 184        test_cmp expect actual &&
 185        git ls-files --recurse-submodules "su?/file" >actual &&
 186        test_cmp expect actual
 187'
 188
 189test_expect_success '--recurse-submodules and pathspecs' '
 190        cat >expect <<-\EOF &&
 191        sib/file
 192        sub/file
 193        EOF
 194
 195        git ls-files --recurse-submodules "s??/file" >actual &&
 196        test_cmp expect actual &&
 197        git ls-files --recurse-submodules "s???file" >actual &&
 198        test_cmp expect actual &&
 199        git ls-files --recurse-submodules "s*file" >actual &&
 200        test_cmp expect actual
 201'
 202
 203test_expect_success '--recurse-submodules and relative paths' '
 204        # From subdir
 205        cat >expect <<-\EOF &&
 206        b
 207        EOF
 208        git -C b ls-files --recurse-submodules >actual &&
 209        test_cmp expect actual &&
 210
 211        # Relative path to top
 212        cat >expect <<-\EOF &&
 213        ../.gitmodules
 214        ../a
 215        b
 216        ../h.txt
 217        ../sib/file
 218        ../sub/file
 219        ../submodule/.gitmodules
 220        ../submodule/c
 221        ../submodule/f.TXT
 222        ../submodule/g.txt
 223        ../submodule/subsub/d
 224        ../submodule/subsub/e.txt
 225        EOF
 226        git -C b ls-files --recurse-submodules -- .. >actual &&
 227        test_cmp expect actual &&
 228
 229        # Relative path to submodule
 230        cat >expect <<-\EOF &&
 231        ../submodule/.gitmodules
 232        ../submodule/c
 233        ../submodule/f.TXT
 234        ../submodule/g.txt
 235        ../submodule/subsub/d
 236        ../submodule/subsub/e.txt
 237        EOF
 238        git -C b ls-files --recurse-submodules -- ../submodule >actual &&
 239        test_cmp expect actual
 240'
 241
 242test_expect_success '--recurse-submodules does not support --error-unmatch' '
 243        test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual &&
 244        test_i18ngrep "does not support --error-unmatch" actual
 245'
 246
 247test_incompatible_with_recurse_submodules () {
 248        test_expect_success "--recurse-submodules and $1 are incompatible" "
 249                test_must_fail git ls-files --recurse-submodules $1 2>actual &&
 250                test_i18ngrep 'unsupported mode' actual
 251        "
 252}
 253
 254test_incompatible_with_recurse_submodules --deleted
 255test_incompatible_with_recurse_submodules --modified
 256test_incompatible_with_recurse_submodules --others
 257test_incompatible_with_recurse_submodules --stage
 258test_incompatible_with_recurse_submodules --killed
 259test_incompatible_with_recurse_submodules --unmerged
 260
 261test_done