2 # Copyright (c) 2010, Jens Lehmann
4 test_description
='Recursive "git fetch" for submodules'
10 add_upstream_commit
() {
13 head1
=$
(git rev-parse
--short HEAD
) &&
14 echo new
>> subfile
&&
17 git commit
-m new subfile
&&
18 head2
=$
(git rev-parse
--short HEAD
) &&
19 echo "Fetching submodule submodule" > ..
/expect.err
&&
20 echo "From $pwd/submodule" >> ..
/expect.err
&&
21 echo " $head1..$head2 master -> origin/master" >> ..
/expect.err
25 head1
=$
(git rev-parse
--short HEAD
) &&
26 echo new
>> deepsubfile
&&
28 git add deepsubfile
&&
29 git commit
-m new deepsubfile
&&
30 head2
=$
(git rev-parse
--short HEAD
) &&
31 echo "Fetching submodule submodule/subdir/deepsubmodule" >> ..
/expect.err
32 echo "From $pwd/deepsubmodule" >> ..
/expect.err
&&
33 echo " $head1..$head2 master -> origin/master" >> ..
/expect.err
37 test_expect_success setup
'
38 mkdir deepsubmodule &&
42 echo deepsubcontent > deepsubfile &&
43 git add deepsubfile &&
44 git commit -m new deepsubfile
50 echo subcontent > subfile &&
52 git submodule add "$pwd/deepsubmodule" subdir/deepsubmodule &&
55 git submodule add "$pwd/submodule" submodule &&
56 git commit -am initial &&
57 git clone . downstream &&
60 git submodule update --init --recursive
64 test_expect_success
"fetch --recurse-submodules recurses into submodules" '
65 add_upstream_commit &&
68 git fetch --recurse-submodules >../actual.out 2>../actual.err
70 test_must_be_empty actual.out &&
71 test_i18ncmp expect.err actual.err
74 test_expect_success
"fetch alone only fetches superproject" '
75 add_upstream_commit &&
78 git fetch >../actual.out 2>../actual.err
80 ! test -s actual.out &&
84 test_expect_success
"fetch --no-recurse-submodules only fetches superproject" '
87 git fetch --no-recurse-submodules >../actual.out 2>../actual.err
89 ! test -s actual.out &&
93 test_expect_success
"using fetchRecurseSubmodules=true in .gitmodules recurses into submodules" '
96 git config -f .gitmodules submodule.submodule.fetchRecurseSubmodules true &&
97 git fetch >../actual.out 2>../actual.err
99 test_must_be_empty actual.out &&
100 test_i18ncmp expect.err actual.err
103 test_expect_success
"--no-recurse-submodules overrides .gitmodules config" '
104 add_upstream_commit &&
107 git fetch --no-recurse-submodules >../actual.out 2>../actual.err
109 ! test -s actual.out &&
113 test_expect_success
"using fetchRecurseSubmodules=false in .git/config overrides setting in .gitmodules" '
116 git config submodule.submodule.fetchRecurseSubmodules false &&
117 git fetch >../actual.out 2>../actual.err
119 ! test -s actual.out &&
123 test_expect_success
"--recurse-submodules overrides fetchRecurseSubmodules setting from .git/config" '
126 git fetch --recurse-submodules >../actual.out 2>../actual.err &&
127 git config --unset -f .gitmodules submodule.submodule.fetchRecurseSubmodules &&
128 git config --unset submodule.submodule.fetchRecurseSubmodules
130 test_must_be_empty actual.out &&
131 test_i18ncmp expect.err actual.err
134 test_expect_success
"--quiet propagates to submodules" '
137 git fetch --recurse-submodules --quiet >../actual.out 2>../actual.err
139 ! test -s actual.out &&
143 test_expect_success
"--dry-run propagates to submodules" '
144 add_upstream_commit &&
147 git fetch --recurse-submodules --dry-run >../actual.out 2>../actual.err
149 test_must_be_empty actual.out &&
150 test_i18ncmp expect.err actual.err
153 test_expect_success
"Without --dry-run propagates to submodules" '
156 git fetch --recurse-submodules >../actual.out 2>../actual.err
158 test_must_be_empty actual.out &&
159 test_i18ncmp expect.err actual.err
162 test_expect_success
"recurseSubmodules=true propagates into submodules" '
163 add_upstream_commit &&
166 git config fetch.recurseSubmodules true
167 git fetch >../actual.out 2>../actual.err
169 test_must_be_empty actual.out &&
170 test_i18ncmp expect.err actual.err
173 test_expect_success
"--recurse-submodules overrides config in submodule" '
174 add_upstream_commit &&
179 git config fetch.recurseSubmodules false
181 git fetch --recurse-submodules >../actual.out 2>../actual.err
183 test_must_be_empty actual.out &&
184 test_i18ncmp expect.err actual.err
187 test_expect_success
"--no-recurse-submodules overrides config setting" '
188 add_upstream_commit &&
191 git config fetch.recurseSubmodules true
192 git fetch --no-recurse-submodules >../actual.out 2>../actual.err
194 ! test -s actual.out &&
198 test_expect_success
"Recursion doesn't happen when no new commits are fetched in the superproject" '
203 git config --unset fetch.recurseSubmodules
205 git config --unset fetch.recurseSubmodules
206 git fetch >../actual.out 2>../actual.err
208 ! test -s actual.out &&
212 test_expect_success
"Recursion stops when no new submodule commits are fetched" '
213 head1=$(git rev-parse --short HEAD) &&
215 git commit -m "new submodule" &&
216 head2=$(git rev-parse --short HEAD) &&
217 echo "From $pwd/." > expect.err.sub &&
218 echo " $head1..$head2 master -> origin/master" >>expect.err.sub &&
219 head -3 expect.err >> expect.err.sub &&
222 git fetch >../actual.out 2>../actual.err
224 test_i18ncmp expect.err.sub actual.err &&
225 test_must_be_empty actual.out
228 test_expect_success
"Recursion doesn't happen when new superproject commits don't change any submodules" '
229 add_upstream_commit &&
230 head1=$(git rev-parse --short HEAD) &&
233 git commit -m "new file" &&
234 head2=$(git rev-parse --short HEAD) &&
235 echo "From $pwd/." > expect.err.file &&
236 echo " $head1..$head2 master -> origin/master" >> expect.err.file &&
239 git fetch >../actual.out 2>../actual.err
241 ! test -s actual.out &&
242 test_i18ncmp expect.err.file actual.err
245 test_expect_success
"Recursion picks up config in submodule" '
248 git fetch --recurse-submodules &&
251 git config fetch.recurseSubmodules true
254 add_upstream_commit &&
255 head1=$(git rev-parse --short HEAD) &&
257 git commit -m "new submodule" &&
258 head2=$(git rev-parse --short HEAD) &&
259 echo "From $pwd/." > expect.err.sub &&
260 echo " $head1..$head2 master -> origin/master" >> expect.err.sub &&
261 cat expect.err >> expect.err.sub &&
264 git fetch >../actual.out 2>../actual.err &&
267 git config --unset fetch.recurseSubmodules
270 test_i18ncmp expect.err.sub actual.err &&
271 test_must_be_empty actual.out
274 test_expect_success
"Recursion picks up all submodules when necessary" '
275 add_upstream_commit &&
279 cd subdir/deepsubmodule &&
281 git checkout -q FETCH_HEAD
283 head1=$(git rev-parse --short HEAD^) &&
284 git add subdir/deepsubmodule &&
285 git commit -m "new deepsubmodule"
286 head2=$(git rev-parse --short HEAD) &&
287 echo "Fetching submodule submodule" > ../expect.err.sub &&
288 echo "From $pwd/submodule" >> ../expect.err.sub &&
289 echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub
291 head1=$(git rev-parse --short HEAD) &&
293 git commit -m "new submodule" &&
294 head2=$(git rev-parse --short HEAD) &&
295 echo "From $pwd/." > expect.err.2 &&
296 echo " $head1..$head2 master -> origin/master" >> expect.err.2 &&
297 cat expect.err.sub >> expect.err.2 &&
298 tail -3 expect.err >> expect.err.2 &&
301 git fetch >../actual.out 2>../actual.err
303 test_i18ncmp expect.err.2 actual.err &&
304 test_must_be_empty actual.out
307 test_expect_success
"'--recurse-submodules=on-demand' doesn't recurse when no new commits are fetched in the superproject (and ignores config)" '
308 add_upstream_commit &&
312 cd subdir/deepsubmodule &&
314 git checkout -q FETCH_HEAD
316 head1=$(git rev-parse --short HEAD^) &&
317 git add subdir/deepsubmodule &&
318 git commit -m "new deepsubmodule" &&
319 head2=$(git rev-parse --short HEAD) &&
320 echo Fetching submodule submodule > ../expect.err.sub &&
321 echo "From $pwd/submodule" >> ../expect.err.sub &&
322 echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub
326 git config fetch.recurseSubmodules true &&
327 git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&
328 git config --unset fetch.recurseSubmodules
330 ! test -s actual.out &&
334 test_expect_success
"'--recurse-submodules=on-demand' recurses as deep as necessary (and ignores config)" '
335 head1=$(git rev-parse --short HEAD) &&
337 git commit -m "new submodule" &&
338 head2=$(git rev-parse --short HEAD) &&
339 tail -3 expect.err > expect.err.deepsub &&
340 echo "From $pwd/." > expect.err &&
341 echo " $head1..$head2 master -> origin/master" >>expect.err &&
342 cat expect.err.sub >> expect.err &&
343 cat expect.err.deepsub >> expect.err &&
346 git config fetch.recurseSubmodules false &&
349 git config -f .gitmodules submodule.subdir/deepsubmodule.fetchRecursive false
351 git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&
352 git config --unset fetch.recurseSubmodules
355 git config --unset -f .gitmodules submodule.subdir/deepsubmodule.fetchRecursive
358 test_must_be_empty actual.out &&
359 test_i18ncmp expect.err actual.err
362 test_expect_success
"'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)" '
363 add_upstream_commit &&
364 head1=$(git rev-parse --short HEAD) &&
367 git commit -m "new file" &&
368 head2=$(git rev-parse --short HEAD) &&
369 echo "From $pwd/." > expect.err.file &&
370 echo " $head1..$head2 master -> origin/master" >> expect.err.file &&
373 git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err
375 ! test -s actual.out &&
376 test_i18ncmp expect.err.file actual.err
379 test_expect_success
"'fetch.recurseSubmodules=on-demand' overrides global config" '
382 git fetch --recurse-submodules
384 add_upstream_commit &&
385 git config --global fetch.recurseSubmodules false &&
386 head1=$(git rev-parse --short HEAD) &&
388 git commit -m "new submodule" &&
389 head2=$(git rev-parse --short HEAD) &&
390 echo "From $pwd/." > expect.err.2 &&
391 echo " $head1..$head2 master -> origin/master" >>expect.err.2 &&
392 head -3 expect.err >> expect.err.2 &&
395 git config fetch.recurseSubmodules on-demand &&
396 git fetch >../actual.out 2>../actual.err
398 git config --global --unset fetch.recurseSubmodules &&
401 git config --unset fetch.recurseSubmodules
403 test_must_be_empty actual.out &&
404 test_i18ncmp expect.err.2 actual.err
407 test_expect_success
"'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules" '
410 git fetch --recurse-submodules
412 add_upstream_commit &&
413 git config fetch.recurseSubmodules false &&
414 head1=$(git rev-parse --short HEAD) &&
416 git commit -m "new submodule" &&
417 head2=$(git rev-parse --short HEAD) &&
418 echo "From $pwd/." > expect.err.2 &&
419 echo " $head1..$head2 master -> origin/master" >>expect.err.2 &&
420 head -3 expect.err >> expect.err.2 &&
423 git config submodule.submodule.fetchRecurseSubmodules on-demand &&
424 git fetch >../actual.out 2>../actual.err
426 git config --unset fetch.recurseSubmodules &&
429 git config --unset submodule.submodule.fetchRecurseSubmodules
431 test_must_be_empty actual.out &&
432 test_i18ncmp expect.err.2 actual.err
435 test_expect_success
"don't fetch submodule when newly recorded commits are already present" '
438 git checkout -q HEAD^^
440 head1=$(git rev-parse --short HEAD) &&
442 git commit -m "submodule rewound" &&
443 head2=$(git rev-parse --short HEAD) &&
444 echo "From $pwd/." > expect.err &&
445 echo " $head1..$head2 master -> origin/master" >> expect.err &&
448 git fetch >../actual.out 2>../actual.err
450 ! test -s actual.out &&
451 test_i18ncmp expect.err actual.err