t / t7814-grep-recurse-submodules.shon commit Merge branch 'bw/pathspec-cleanup' (fe9ec8b)
   1#!/bin/sh
   2
   3test_description='Test grep recurse-submodules feature
   4
   5This test verifies the recurse-submodules feature correctly greps across
   6submodules.
   7'
   8
   9. ./test-lib.sh
  10
  11test_expect_success 'setup directory structure and submodule' '
  12        echo "foobar" >a &&
  13        mkdir b &&
  14        echo "bar" >b/b &&
  15        git add a b &&
  16        git commit -m "add a and b" &&
  17        git init submodule &&
  18        echo "foobar" >submodule/a &&
  19        git -C submodule add a &&
  20        git -C submodule commit -m "add a" &&
  21        git submodule add ./submodule &&
  22        git commit -m "added submodule"
  23'
  24
  25test_expect_success 'grep correctly finds patterns in a submodule' '
  26        cat >expect <<-\EOF &&
  27        a:foobar
  28        b/b:bar
  29        submodule/a:foobar
  30        EOF
  31
  32        git grep -e "bar" --recurse-submodules >actual &&
  33        test_cmp expect actual
  34'
  35
  36test_expect_success 'grep and basic pathspecs' '
  37        cat >expect <<-\EOF &&
  38        submodule/a:foobar
  39        EOF
  40
  41        git grep -e. --recurse-submodules -- submodule >actual &&
  42        test_cmp expect actual
  43'
  44
  45test_expect_success 'grep and nested submodules' '
  46        git init submodule/sub &&
  47        echo "foobar" >submodule/sub/a &&
  48        git -C submodule/sub add a &&
  49        git -C submodule/sub commit -m "add a" &&
  50        git -C submodule submodule add ./sub &&
  51        git -C submodule add sub &&
  52        git -C submodule commit -m "added sub" &&
  53        git add submodule &&
  54        git commit -m "updated submodule" &&
  55
  56        cat >expect <<-\EOF &&
  57        a:foobar
  58        b/b:bar
  59        submodule/a:foobar
  60        submodule/sub/a:foobar
  61        EOF
  62
  63        git grep -e "bar" --recurse-submodules >actual &&
  64        test_cmp expect actual
  65'
  66
  67test_expect_success 'grep and multiple patterns' '
  68        cat >expect <<-\EOF &&
  69        a:foobar
  70        submodule/a:foobar
  71        submodule/sub/a:foobar
  72        EOF
  73
  74        git grep -e "bar" --and -e "foo" --recurse-submodules >actual &&
  75        test_cmp expect actual
  76'
  77
  78test_expect_success 'grep and multiple patterns' '
  79        cat >expect <<-\EOF &&
  80        b/b:bar
  81        EOF
  82
  83        git grep -e "bar" --and --not -e "foo" --recurse-submodules >actual &&
  84        test_cmp expect actual
  85'
  86
  87test_expect_success 'basic grep tree' '
  88        cat >expect <<-\EOF &&
  89        HEAD:a:foobar
  90        HEAD:b/b:bar
  91        HEAD:submodule/a:foobar
  92        HEAD:submodule/sub/a:foobar
  93        EOF
  94
  95        git grep -e "bar" --recurse-submodules HEAD >actual &&
  96        test_cmp expect actual
  97'
  98
  99test_expect_success 'grep tree HEAD^' '
 100        cat >expect <<-\EOF &&
 101        HEAD^:a:foobar
 102        HEAD^:b/b:bar
 103        HEAD^:submodule/a:foobar
 104        EOF
 105
 106        git grep -e "bar" --recurse-submodules HEAD^ >actual &&
 107        test_cmp expect actual
 108'
 109
 110test_expect_success 'grep tree HEAD^^' '
 111        cat >expect <<-\EOF &&
 112        HEAD^^:a:foobar
 113        HEAD^^:b/b:bar
 114        EOF
 115
 116        git grep -e "bar" --recurse-submodules HEAD^^ >actual &&
 117        test_cmp expect actual
 118'
 119
 120test_expect_success 'grep tree and pathspecs' '
 121        cat >expect <<-\EOF &&
 122        HEAD:submodule/a:foobar
 123        HEAD:submodule/sub/a:foobar
 124        EOF
 125
 126        git grep -e "bar" --recurse-submodules HEAD -- submodule >actual &&
 127        test_cmp expect actual
 128'
 129
 130test_expect_success 'grep tree and pathspecs' '
 131        cat >expect <<-\EOF &&
 132        HEAD:submodule/a:foobar
 133        HEAD:submodule/sub/a:foobar
 134        EOF
 135
 136        git grep -e "bar" --recurse-submodules HEAD -- "submodule*a" >actual &&
 137        test_cmp expect actual
 138'
 139
 140test_expect_success 'grep tree and more pathspecs' '
 141        cat >expect <<-\EOF &&
 142        HEAD:submodule/a:foobar
 143        EOF
 144
 145        git grep -e "bar" --recurse-submodules HEAD -- "submodul?/a" >actual &&
 146        test_cmp expect actual
 147'
 148
 149test_expect_success 'grep tree and more pathspecs' '
 150        cat >expect <<-\EOF &&
 151        HEAD:submodule/sub/a:foobar
 152        EOF
 153
 154        git grep -e "bar" --recurse-submodules HEAD -- "submodul*/sub/a" >actual &&
 155        test_cmp expect actual
 156'
 157
 158test_expect_success !MINGW 'grep recurse submodule colon in name' '
 159        git init parent &&
 160        test_when_finished "rm -rf parent" &&
 161        echo "foobar" >"parent/fi:le" &&
 162        git -C parent add "fi:le" &&
 163        git -C parent commit -m "add fi:le" &&
 164
 165        git init "su:b" &&
 166        test_when_finished "rm -rf su:b" &&
 167        echo "foobar" >"su:b/fi:le" &&
 168        git -C "su:b" add "fi:le" &&
 169        git -C "su:b" commit -m "add fi:le" &&
 170
 171        git -C parent submodule add "../su:b" "su:b" &&
 172        git -C parent commit -m "add submodule" &&
 173
 174        cat >expect <<-\EOF &&
 175        fi:le:foobar
 176        su:b/fi:le:foobar
 177        EOF
 178        git -C parent grep -e "foobar" --recurse-submodules >actual &&
 179        test_cmp expect actual &&
 180
 181        cat >expect <<-\EOF &&
 182        HEAD:fi:le:foobar
 183        HEAD:su:b/fi:le:foobar
 184        EOF
 185        git -C parent grep -e "foobar" --recurse-submodules HEAD >actual &&
 186        test_cmp expect actual
 187'
 188
 189test_expect_success 'grep history with moved submoules' '
 190        git init parent &&
 191        test_when_finished "rm -rf parent" &&
 192        echo "foobar" >parent/file &&
 193        git -C parent add file &&
 194        git -C parent commit -m "add file" &&
 195
 196        git init sub &&
 197        test_when_finished "rm -rf sub" &&
 198        echo "foobar" >sub/file &&
 199        git -C sub add file &&
 200        git -C sub commit -m "add file" &&
 201
 202        git -C parent submodule add ../sub dir/sub &&
 203        git -C parent commit -m "add submodule" &&
 204
 205        cat >expect <<-\EOF &&
 206        dir/sub/file:foobar
 207        file:foobar
 208        EOF
 209        git -C parent grep -e "foobar" --recurse-submodules >actual &&
 210        test_cmp expect actual &&
 211
 212        git -C parent mv dir/sub sub-moved &&
 213        git -C parent commit -m "moved submodule" &&
 214
 215        cat >expect <<-\EOF &&
 216        file:foobar
 217        sub-moved/file:foobar
 218        EOF
 219        git -C parent grep -e "foobar" --recurse-submodules >actual &&
 220        test_cmp expect actual &&
 221
 222        cat >expect <<-\EOF &&
 223        HEAD^:dir/sub/file:foobar
 224        HEAD^:file:foobar
 225        EOF
 226        git -C parent grep -e "foobar" --recurse-submodules HEAD^ >actual &&
 227        test_cmp expect actual
 228'
 229
 230test_incompatible_with_recurse_submodules ()
 231{
 232        test_expect_success "--recurse-submodules and $1 are incompatible" "
 233                test_must_fail git grep -e. --recurse-submodules $1 2>actual &&
 234                test_i18ngrep 'not supported with --recurse-submodules' actual
 235        "
 236}
 237
 238test_incompatible_with_recurse_submodules --untracked
 239test_incompatible_with_recurse_submodules --no-index
 240
 241test_done