Merge branch 'sb/submodule-embed-gitdir'
[git] / t / t7814-grep-recurse-submodules.sh
1 #!/bin/sh
2
3 test_description='Test grep recurse-submodules feature
4
5 This test verifies the recurse-submodules feature correctly greps across
6 submodules.
7 '
8
9 . ./test-lib.sh
10
11 test_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
25 test_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
36 test_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
45 test_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
67 test_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
78 test_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
87 test_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
99 test_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
110 test_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
120 test_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
130 test_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
140 test_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
149 test_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
158 test_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
189 test_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
230 test_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
238 test_incompatible_with_recurse_submodules --untracked
239 test_incompatible_with_recurse_submodules --no-index
240
241 test_done