Commit | Line | Data |
---|---|---|
27bfd950 PY |
1 | #!/bin/sh |
2 | ||
47a528ad | 3 | test_description='git status for submodule' |
27bfd950 PY |
4 | |
5 | . ./test-lib.sh | |
6 | ||
44ca0c8e HV |
7 | test_create_repo_with_commit () { |
8 | test_create_repo "$1" && | |
ee6fc514 | 9 | ( |
44ca0c8e | 10 | cd "$1" && |
ee6fc514 JL |
11 | : >bar && |
12 | git add bar && | |
13 | git commit -m " Add bar" && | |
14 | : >foo && | |
15 | git add foo && | |
16 | git commit -m " Add foo" | |
44ca0c8e HV |
17 | ) |
18 | } | |
19 | ||
dd6962dd SB |
20 | sanitize_output () { |
21 | sed -e "s/$_x40/HASH/" -e "s/$_x40/HASH/" output >output2 && | |
22 | mv output2 output | |
23 | } | |
24 | ||
25 | ||
44ca0c8e HV |
26 | test_expect_success 'setup' ' |
27 | test_create_repo_with_commit sub && | |
ee6fc514 JL |
28 | echo output > .gitignore && |
29 | git add sub .gitignore && | |
27bfd950 PY |
30 | git commit -m "Add submodule sub" |
31 | ' | |
32 | ||
7a23d2d2 | 33 | test_expect_success 'status clean' ' |
ee6fc514 | 34 | git status >output && |
7a23d2d2 | 35 | test_i18ngrep "nothing to commit" output |
27bfd950 | 36 | ' |
ee6fc514 | 37 | |
7a23d2d2 | 38 | test_expect_success 'commit --dry-run -a clean' ' |
ee6fc514 | 39 | test_must_fail git commit --dry-run -a >output && |
7a23d2d2 | 40 | test_i18ngrep "nothing to commit" output |
ee6fc514 JL |
41 | ' |
42 | ||
7a23d2d2 | 43 | test_expect_success 'status with modified file in submodule' ' |
ee6fc514 JL |
44 | (cd sub && git reset --hard) && |
45 | echo "changed" >sub/foo && | |
46 | git status >output && | |
7a23d2d2 | 47 | test_i18ngrep "modified: sub (modified content)" output |
ee6fc514 JL |
48 | ' |
49 | ||
50 | test_expect_success 'status with modified file in submodule (porcelain)' ' | |
51 | (cd sub && git reset --hard) && | |
52 | echo "changed" >sub/foo && | |
53 | git status --porcelain >output && | |
54 | diff output - <<-\EOF | |
55 | M sub | |
56 | EOF | |
57 | ' | |
58 | ||
dd6962dd SB |
59 | test_expect_success 'status with modified file in submodule (short)' ' |
60 | (cd sub && git reset --hard) && | |
61 | echo "changed" >sub/foo && | |
62 | git status --short >output && | |
63 | diff output - <<-\EOF | |
64 | m sub | |
65 | EOF | |
66 | ' | |
67 | ||
7a23d2d2 | 68 | test_expect_success 'status with added file in submodule' ' |
ee6fc514 JL |
69 | (cd sub && git reset --hard && echo >foo && git add foo) && |
70 | git status >output && | |
7a23d2d2 | 71 | test_i18ngrep "modified: sub (modified content)" output |
ee6fc514 JL |
72 | ' |
73 | ||
74 | test_expect_success 'status with added file in submodule (porcelain)' ' | |
75 | (cd sub && git reset --hard && echo >foo && git add foo) && | |
76 | git status --porcelain >output && | |
77 | diff output - <<-\EOF | |
78 | M sub | |
79 | EOF | |
80 | ' | |
81 | ||
dd6962dd SB |
82 | test_expect_success 'status with added file in submodule (short)' ' |
83 | (cd sub && git reset --hard && echo >foo && git add foo) && | |
84 | git status --short >output && | |
85 | diff output - <<-\EOF | |
86 | m sub | |
87 | EOF | |
88 | ' | |
89 | ||
7a23d2d2 | 90 | test_expect_success 'status with untracked file in submodule' ' |
ee6fc514 JL |
91 | (cd sub && git reset --hard) && |
92 | echo "content" >sub/new-file && | |
93 | git status >output && | |
7a23d2d2 | 94 | test_i18ngrep "modified: sub (untracked content)" output |
ee6fc514 JL |
95 | ' |
96 | ||
7a23d2d2 | 97 | test_expect_success 'status -uno with untracked file in submodule' ' |
3bfc4504 | 98 | git status -uno >output && |
7a23d2d2 | 99 | test_i18ngrep "^nothing to commit" output |
3bfc4504 JL |
100 | ' |
101 | ||
ee6fc514 JL |
102 | test_expect_success 'status with untracked file in submodule (porcelain)' ' |
103 | git status --porcelain >output && | |
104 | diff output - <<-\EOF | |
105 | M sub | |
106 | EOF | |
27bfd950 | 107 | ' |
ee6fc514 | 108 | |
dd6962dd SB |
109 | test_expect_success 'status with untracked file in submodule (short)' ' |
110 | git status --short >output && | |
111 | diff output - <<-\EOF | |
112 | ? sub | |
113 | EOF | |
114 | ' | |
115 | ||
7a23d2d2 | 116 | test_expect_success 'status with added and untracked file in submodule' ' |
85adbf2f JL |
117 | (cd sub && git reset --hard && echo >foo && git add foo) && |
118 | echo "content" >sub/new-file && | |
119 | git status >output && | |
7a23d2d2 | 120 | test_i18ngrep "modified: sub (modified content, untracked content)" output |
85adbf2f JL |
121 | ' |
122 | ||
123 | test_expect_success 'status with added and untracked file in submodule (porcelain)' ' | |
124 | (cd sub && git reset --hard && echo >foo && git add foo) && | |
125 | echo "content" >sub/new-file && | |
126 | git status --porcelain >output && | |
127 | diff output - <<-\EOF | |
128 | M sub | |
129 | EOF | |
130 | ' | |
131 | ||
7a23d2d2 | 132 | test_expect_success 'status with modified file in modified submodule' ' |
85adbf2f JL |
133 | (cd sub && git reset --hard) && |
134 | rm sub/new-file && | |
135 | (cd sub && echo "next change" >foo && git commit -m "next change" foo) && | |
136 | echo "changed" >sub/foo && | |
137 | git status >output && | |
7a23d2d2 | 138 | test_i18ngrep "modified: sub (new commits, modified content)" output |
85adbf2f JL |
139 | ' |
140 | ||
141 | test_expect_success 'status with modified file in modified submodule (porcelain)' ' | |
142 | (cd sub && git reset --hard) && | |
143 | echo "changed" >sub/foo && | |
144 | git status --porcelain >output && | |
145 | diff output - <<-\EOF | |
146 | M sub | |
147 | EOF | |
148 | ' | |
149 | ||
7a23d2d2 | 150 | test_expect_success 'status with added file in modified submodule' ' |
85adbf2f JL |
151 | (cd sub && git reset --hard && echo >foo && git add foo) && |
152 | git status >output && | |
7a23d2d2 | 153 | test_i18ngrep "modified: sub (new commits, modified content)" output |
85adbf2f JL |
154 | ' |
155 | ||
156 | test_expect_success 'status with added file in modified submodule (porcelain)' ' | |
157 | (cd sub && git reset --hard && echo >foo && git add foo) && | |
158 | git status --porcelain >output && | |
159 | diff output - <<-\EOF | |
160 | M sub | |
161 | EOF | |
162 | ' | |
163 | ||
7a23d2d2 | 164 | test_expect_success 'status with untracked file in modified submodule' ' |
85adbf2f JL |
165 | (cd sub && git reset --hard) && |
166 | echo "content" >sub/new-file && | |
167 | git status >output && | |
7a23d2d2 | 168 | test_i18ngrep "modified: sub (new commits, untracked content)" output |
85adbf2f JL |
169 | ' |
170 | ||
171 | test_expect_success 'status with untracked file in modified submodule (porcelain)' ' | |
172 | git status --porcelain >output && | |
173 | diff output - <<-\EOF | |
174 | M sub | |
175 | EOF | |
176 | ' | |
177 | ||
7a23d2d2 | 178 | test_expect_success 'status with added and untracked file in modified submodule' ' |
85adbf2f JL |
179 | (cd sub && git reset --hard && echo >foo && git add foo) && |
180 | echo "content" >sub/new-file && | |
181 | git status >output && | |
7a23d2d2 | 182 | test_i18ngrep "modified: sub (new commits, modified content, untracked content)" output |
85adbf2f JL |
183 | ' |
184 | ||
185 | test_expect_success 'status with added and untracked file in modified submodule (porcelain)' ' | |
186 | (cd sub && git reset --hard && echo >foo && git add foo) && | |
187 | echo "content" >sub/new-file && | |
188 | git status --porcelain >output && | |
189 | diff output - <<-\EOF | |
190 | M sub | |
191 | EOF | |
192 | ' | |
193 | ||
eee49b6c JL |
194 | test_expect_success 'setup .git file for sub' ' |
195 | (cd sub && | |
196 | rm -f new-file | |
197 | REAL="$(pwd)/../.real" && | |
198 | mv .git "$REAL" | |
199 | echo "gitdir: $REAL" >.git) && | |
200 | echo .real >>.gitignore && | |
201 | git commit -m "added .real to .gitignore" .gitignore | |
202 | ' | |
203 | ||
7a23d2d2 | 204 | test_expect_success 'status with added file in modified submodule with .git file' ' |
eee49b6c JL |
205 | (cd sub && git reset --hard && echo >foo && git add foo) && |
206 | git status >output && | |
7a23d2d2 | 207 | test_i18ngrep "modified: sub (new commits, modified content)" output |
eee49b6c JL |
208 | ' |
209 | ||
af6865a7 SB |
210 | test_expect_success 'status with a lot of untracked files in the submodule' ' |
211 | ( | |
212 | cd sub | |
213 | i=0 && | |
214 | while test $i -lt 1024 | |
215 | do | |
216 | >some-file-$i | |
217 | i=$(( $i + 1 )) | |
218 | done | |
219 | ) && | |
220 | git status --porcelain sub 2>err.actual && | |
221 | test_must_be_empty err.actual && | |
222 | rm err.actual | |
223 | ' | |
224 | ||
27bfd950 | 225 | test_expect_success 'rm submodule contents' ' |
af6865a7 SB |
226 | rm -rf sub && |
227 | mkdir sub | |
27bfd950 | 228 | ' |
ee6fc514 | 229 | |
7a23d2d2 | 230 | test_expect_success 'status clean (empty submodule dir)' ' |
ee6fc514 | 231 | git status >output && |
7a23d2d2 | 232 | test_i18ngrep "nothing to commit" output |
27bfd950 | 233 | ' |
ee6fc514 | 234 | |
7a23d2d2 | 235 | test_expect_success 'status -a clean (empty submodule dir)' ' |
ee6fc514 | 236 | test_must_fail git commit --dry-run -a >output && |
7a23d2d2 | 237 | test_i18ngrep "nothing to commit" output |
27bfd950 PY |
238 | ' |
239 | ||
44ca0c8e HV |
240 | cat >status_expect <<\EOF |
241 | AA .gitmodules | |
242 | A sub1 | |
243 | EOF | |
244 | ||
d4e98b58 | 245 | test_expect_success 'status with merge conflict in .gitmodules' ' |
44ca0c8e HV |
246 | git clone . super && |
247 | test_create_repo_with_commit sub1 && | |
248 | test_tick && | |
249 | test_create_repo_with_commit sub2 && | |
250 | ( | |
251 | cd super && | |
252 | prev=$(git rev-parse HEAD) && | |
253 | git checkout -b add_sub1 && | |
254 | git submodule add ../sub1 && | |
255 | git commit -m "add sub1" && | |
256 | git checkout -b add_sub2 $prev && | |
257 | git submodule add ../sub2 && | |
258 | git commit -m "add sub2" && | |
259 | git checkout -b merge_conflict_gitmodules && | |
260 | test_must_fail git merge add_sub1 && | |
261 | git status -s >../status_actual 2>&1 | |
262 | ) && | |
263 | test_cmp status_actual status_expect | |
264 | ' | |
265 | ||
266 | sha1_merge_sub1=$(cd sub1 && git rev-parse HEAD) | |
267 | sha1_merge_sub2=$(cd sub2 && git rev-parse HEAD) | |
268 | short_sha1_merge_sub1=$(cd sub1 && git rev-parse --short HEAD) | |
269 | short_sha1_merge_sub2=$(cd sub2 && git rev-parse --short HEAD) | |
270 | cat >diff_expect <<\EOF | |
271 | diff --cc .gitmodules | |
272 | index badaa4c,44f999a..0000000 | |
273 | --- a/.gitmodules | |
274 | +++ b/.gitmodules | |
275 | @@@ -1,3 -1,3 +1,9 @@@ | |
276 | ++<<<<<<< HEAD | |
277 | +[submodule "sub2"] | |
278 | + path = sub2 | |
279 | + url = ../sub2 | |
280 | ++======= | |
281 | + [submodule "sub1"] | |
282 | + path = sub1 | |
283 | + url = ../sub1 | |
284 | ++>>>>>>> add_sub1 | |
285 | EOF | |
286 | ||
287 | cat >diff_submodule_expect <<\EOF | |
288 | diff --cc .gitmodules | |
289 | index badaa4c,44f999a..0000000 | |
290 | --- a/.gitmodules | |
291 | +++ b/.gitmodules | |
292 | @@@ -1,3 -1,3 +1,9 @@@ | |
293 | ++<<<<<<< HEAD | |
294 | +[submodule "sub2"] | |
295 | + path = sub2 | |
296 | + url = ../sub2 | |
297 | ++======= | |
298 | + [submodule "sub1"] | |
299 | + path = sub1 | |
300 | + url = ../sub1 | |
301 | ++>>>>>>> add_sub1 | |
302 | EOF | |
303 | ||
d4e98b58 | 304 | test_expect_success 'diff with merge conflict in .gitmodules' ' |
44ca0c8e HV |
305 | ( |
306 | cd super && | |
307 | git diff >../diff_actual 2>&1 | |
308 | ) && | |
9c5b2fab | 309 | test_cmp diff_expect diff_actual |
44ca0c8e HV |
310 | ' |
311 | ||
d4e98b58 | 312 | test_expect_success 'diff --submodule with merge conflict in .gitmodules' ' |
44ca0c8e HV |
313 | ( |
314 | cd super && | |
315 | git diff --submodule >../diff_submodule_actual 2>&1 | |
316 | ) && | |
9c5b2fab | 317 | test_cmp diff_submodule_expect diff_submodule_actual |
44ca0c8e HV |
318 | ' |
319 | ||
dd6962dd SB |
320 | # We'll setup different cases for further testing: |
321 | # sub1 will contain a nested submodule, | |
322 | # sub2 will have an untracked file | |
323 | # sub3 will have an untracked repository | |
324 | test_expect_success 'setup superproject with untracked file in nested submodule' ' | |
325 | ( | |
326 | cd super && | |
327 | git clean -dfx && | |
328 | rm .gitmodules && | |
329 | git submodule add -f ./sub1 && | |
330 | git submodule add -f ./sub2 && | |
331 | git submodule add -f ./sub1 sub3 && | |
332 | git commit -a -m "messy merge in superproject" && | |
333 | ( | |
334 | cd sub1 && | |
335 | git submodule add ../sub2 && | |
336 | git commit -a -m "add sub2 to sub1" | |
337 | ) && | |
338 | git add sub1 && | |
339 | git commit -a -m "update sub1 to contain nested sub" | |
340 | ) && | |
341 | echo content >super/sub1/sub2/file && | |
342 | echo content >super/sub2/file && | |
343 | git -C super/sub3 clone ../../sub2 untracked_repository | |
344 | ' | |
345 | ||
346 | test_expect_success 'status with untracked file in nested submodule (porcelain)' ' | |
347 | git -C super status --porcelain >output && | |
348 | diff output - <<-\EOF | |
349 | M sub1 | |
350 | M sub2 | |
351 | M sub3 | |
352 | EOF | |
353 | ' | |
354 | ||
355 | test_expect_success 'status with untracked file in nested submodule (porcelain=2)' ' | |
356 | git -C super status --porcelain=2 >output && | |
357 | sanitize_output output && | |
358 | diff output - <<-\EOF | |
40069d6e | 359 | 1 .M S..U 160000 160000 160000 HASH HASH sub1 |
dd6962dd SB |
360 | 1 .M S..U 160000 160000 160000 HASH HASH sub2 |
361 | 1 .M S..U 160000 160000 160000 HASH HASH sub3 | |
362 | EOF | |
363 | ' | |
364 | ||
365 | test_expect_success 'status with untracked file in nested submodule (short)' ' | |
366 | git -C super status --short >output && | |
367 | diff output - <<-\EOF | |
40069d6e | 368 | ? sub1 |
dd6962dd SB |
369 | ? sub2 |
370 | ? sub3 | |
371 | EOF | |
372 | ' | |
373 | ||
374 | test_expect_success 'setup superproject with modified file in nested submodule' ' | |
375 | git -C super/sub1/sub2 add file && | |
376 | git -C super/sub2 add file | |
377 | ' | |
378 | ||
379 | test_expect_success 'status with added file in nested submodule (porcelain)' ' | |
380 | git -C super status --porcelain >output && | |
381 | diff output - <<-\EOF | |
382 | M sub1 | |
383 | M sub2 | |
384 | M sub3 | |
385 | EOF | |
386 | ' | |
387 | ||
388 | test_expect_success 'status with added file in nested submodule (porcelain=2)' ' | |
389 | git -C super status --porcelain=2 >output && | |
390 | sanitize_output output && | |
391 | diff output - <<-\EOF | |
392 | 1 .M S.M. 160000 160000 160000 HASH HASH sub1 | |
393 | 1 .M S.M. 160000 160000 160000 HASH HASH sub2 | |
394 | 1 .M S..U 160000 160000 160000 HASH HASH sub3 | |
395 | EOF | |
396 | ' | |
397 | ||
398 | test_expect_success 'status with added file in nested submodule (short)' ' | |
399 | git -C super status --short >output && | |
400 | diff output - <<-\EOF | |
401 | m sub1 | |
402 | m sub2 | |
403 | ? sub3 | |
404 | EOF | |
405 | ' | |
406 | ||
27bfd950 | 407 | test_done |