Merge branch 'en/fill-directory-fixes-more'
[git] / t / t3007-ls-files-recurse-submodules.sh
1 #!/bin/sh
2
3 test_description='Test ls-files recurse-submodules feature
4
5 This test verifies the recurse-submodules feature correctly lists files from
6 submodules.
7 '
8
9 . ./test-lib.sh
10
11 test_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
25 test_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
37 test_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
49 test_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
64 test_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
85 test_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
96 test_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
138 test_expect_success 'inactive submodule' '
139         test_when_finished "git config --bool submodule.submodule.active true" &&
140         test_when_finished "git -C submodule config --bool submodule.subsub.active true" &&
141         git config --bool submodule.submodule.active "false" &&
142
143         cat >expect <<-\EOF &&
144         .gitmodules
145         a
146         b/b
147         h.txt
148         sib/file
149         sub/file
150         submodule
151         EOF
152
153         git ls-files --recurse-submodules >actual &&
154         test_cmp expect actual &&
155
156         git config --bool submodule.submodule.active "true" &&
157         git -C submodule config --bool submodule.subsub.active "false" &&
158
159         cat >expect <<-\EOF &&
160         .gitmodules
161         a
162         b/b
163         h.txt
164         sib/file
165         sub/file
166         submodule/.gitmodules
167         submodule/c
168         submodule/f.TXT
169         submodule/g.txt
170         submodule/subsub
171         EOF
172
173         git ls-files --recurse-submodules >actual &&
174         test_cmp expect actual
175 '
176
177 test_expect_success '--recurse-submodules and pathspecs' '
178         cat >expect <<-\EOF &&
179         h.txt
180         submodule/g.txt
181         submodule/subsub/e.txt
182         EOF
183
184         git ls-files --recurse-submodules "*.txt" >actual &&
185         test_cmp expect actual
186 '
187
188 test_expect_success '--recurse-submodules and pathspecs' '
189         cat >expect <<-\EOF &&
190         h.txt
191         submodule/f.TXT
192         submodule/g.txt
193         submodule/subsub/e.txt
194         EOF
195
196         git ls-files --recurse-submodules ":(icase)*.txt" >actual &&
197         test_cmp expect actual
198 '
199
200 test_expect_success '--recurse-submodules and pathspecs' '
201         cat >expect <<-\EOF &&
202         h.txt
203         submodule/f.TXT
204         submodule/g.txt
205         EOF
206
207         git ls-files --recurse-submodules ":(icase)*.txt" ":(exclude)submodule/subsub/*" >actual &&
208         test_cmp expect actual
209 '
210
211 test_expect_success '--recurse-submodules and pathspecs' '
212         cat >expect <<-\EOF &&
213         sub/file
214         EOF
215
216         git ls-files --recurse-submodules "sub" >actual &&
217         test_cmp expect actual &&
218         git ls-files --recurse-submodules "sub/" >actual &&
219         test_cmp expect actual &&
220         git ls-files --recurse-submodules "sub/file" >actual &&
221         test_cmp expect actual &&
222         git ls-files --recurse-submodules "su*/file" >actual &&
223         test_cmp expect actual &&
224         git ls-files --recurse-submodules "su?/file" >actual &&
225         test_cmp expect actual
226 '
227
228 test_expect_success '--recurse-submodules and pathspecs' '
229         cat >expect <<-\EOF &&
230         sib/file
231         sub/file
232         EOF
233
234         git ls-files --recurse-submodules "s??/file" >actual &&
235         test_cmp expect actual &&
236         git ls-files --recurse-submodules "s???file" >actual &&
237         test_cmp expect actual &&
238         git ls-files --recurse-submodules "s*file" >actual &&
239         test_cmp expect actual
240 '
241
242 test_expect_success '--recurse-submodules and relative paths' '
243         # From subdir
244         cat >expect <<-\EOF &&
245         b
246         EOF
247         git -C b ls-files --recurse-submodules >actual &&
248         test_cmp expect actual &&
249
250         # Relative path to top
251         cat >expect <<-\EOF &&
252         ../.gitmodules
253         ../a
254         b
255         ../h.txt
256         ../sib/file
257         ../sub/file
258         ../submodule/.gitmodules
259         ../submodule/c
260         ../submodule/f.TXT
261         ../submodule/g.txt
262         ../submodule/subsub/d
263         ../submodule/subsub/e.txt
264         EOF
265         git -C b ls-files --recurse-submodules -- .. >actual &&
266         test_cmp expect actual &&
267
268         # Relative path to submodule
269         cat >expect <<-\EOF &&
270         ../submodule/.gitmodules
271         ../submodule/c
272         ../submodule/f.TXT
273         ../submodule/g.txt
274         ../submodule/subsub/d
275         ../submodule/subsub/e.txt
276         EOF
277         git -C b ls-files --recurse-submodules -- ../submodule >actual &&
278         test_cmp expect actual
279 '
280
281 test_expect_success '--recurse-submodules does not support --error-unmatch' '
282         test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual &&
283         test_i18ngrep "does not support --error-unmatch" actual
284 '
285
286 test_incompatible_with_recurse_submodules () {
287         test_expect_success "--recurse-submodules and $1 are incompatible" "
288                 test_must_fail git ls-files --recurse-submodules $1 2>actual &&
289                 test_i18ngrep 'unsupported mode' actual
290         "
291 }
292
293 test_incompatible_with_recurse_submodules --deleted
294 test_incompatible_with_recurse_submodules --modified
295 test_incompatible_with_recurse_submodules --others
296 test_incompatible_with_recurse_submodules --stage
297 test_incompatible_with_recurse_submodules --killed
298 test_incompatible_with_recurse_submodules --unmerged
299
300 test_done