test-read-cache: setup git dir
[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 ls-files --recurse-submodules >actual &&
81         test_cmp expect actual
82 '
83
84 test_expect_success '--recurse-submodules and pathspecs setup' '
85         echo e >submodule/subsub/e.txt &&
86         git -C submodule/subsub add e.txt &&
87         git -C submodule/subsub commit -m "adding e.txt" &&
88         echo f >submodule/f.TXT &&
89         echo g >submodule/g.txt &&
90         git -C submodule add f.TXT g.txt &&
91         git -C submodule commit -m "add f and g" &&
92         echo h >h.txt &&
93         mkdir sib &&
94         echo sib >sib/file &&
95         git add h.txt sib/file &&
96         git commit -m "add h and sib/file" &&
97         git init sub &&
98         echo sub >sub/file &&
99         git -C sub add file &&
100         git -C sub commit -m "add file" &&
101         git submodule add ./sub &&
102         git commit -m "added sub" &&
103
104         cat >expect <<-\EOF &&
105         .gitmodules
106         a
107         b/b
108         h.txt
109         sib/file
110         sub/file
111         submodule/.gitmodules
112         submodule/c
113         submodule/f.TXT
114         submodule/g.txt
115         submodule/subsub/d
116         submodule/subsub/e.txt
117         EOF
118
119         git ls-files --recurse-submodules >actual &&
120         test_cmp expect actual &&
121         cat actual &&
122         git ls-files --recurse-submodules "*" >actual &&
123         test_cmp expect actual
124 '
125
126 test_expect_success '--recurse-submodules and pathspecs' '
127         cat >expect <<-\EOF &&
128         h.txt
129         submodule/g.txt
130         submodule/subsub/e.txt
131         EOF
132
133         git ls-files --recurse-submodules "*.txt" >actual &&
134         test_cmp expect actual
135 '
136
137 test_expect_success '--recurse-submodules and pathspecs' '
138         cat >expect <<-\EOF &&
139         h.txt
140         submodule/f.TXT
141         submodule/g.txt
142         submodule/subsub/e.txt
143         EOF
144
145         git ls-files --recurse-submodules ":(icase)*.txt" >actual &&
146         test_cmp expect actual
147 '
148
149 test_expect_success '--recurse-submodules and pathspecs' '
150         cat >expect <<-\EOF &&
151         h.txt
152         submodule/f.TXT
153         submodule/g.txt
154         EOF
155
156         git ls-files --recurse-submodules ":(icase)*.txt" ":(exclude)submodule/subsub/*" >actual &&
157         test_cmp expect actual
158 '
159
160 test_expect_success '--recurse-submodules and pathspecs' '
161         cat >expect <<-\EOF &&
162         sub/file
163         EOF
164
165         git ls-files --recurse-submodules "sub" >actual &&
166         test_cmp expect actual &&
167         git ls-files --recurse-submodules "sub/" >actual &&
168         test_cmp expect actual &&
169         git ls-files --recurse-submodules "sub/file" >actual &&
170         test_cmp expect actual &&
171         git ls-files --recurse-submodules "su*/file" >actual &&
172         test_cmp expect actual &&
173         git ls-files --recurse-submodules "su?/file" >actual &&
174         test_cmp expect actual
175 '
176
177 test_expect_success '--recurse-submodules and pathspecs' '
178         cat >expect <<-\EOF &&
179         sib/file
180         sub/file
181         EOF
182
183         git ls-files --recurse-submodules "s??/file" >actual &&
184         test_cmp expect actual &&
185         git ls-files --recurse-submodules "s???file" >actual &&
186         test_cmp expect actual &&
187         git ls-files --recurse-submodules "s*file" >actual &&
188         test_cmp expect actual
189 '
190
191 test_expect_success '--recurse-submodules does not support --error-unmatch' '
192         test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual &&
193         test_i18ngrep "does not support --error-unmatch" actual
194 '
195
196 test_incompatible_with_recurse_submodules () {
197         test_expect_success "--recurse-submodules and $1 are incompatible" "
198                 test_must_fail git ls-files --recurse-submodules $1 2>actual &&
199                 test_i18ngrep 'unsupported mode' actual
200         "
201 }
202
203 test_incompatible_with_recurse_submodules --deleted
204 test_incompatible_with_recurse_submodules --modified
205 test_incompatible_with_recurse_submodules --others
206 test_incompatible_with_recurse_submodules --stage
207 test_incompatible_with_recurse_submodules --killed
208 test_incompatible_with_recurse_submodules --unmerged
209
210 test_done