add-patch: plug a leak handling the '/' command
[alt-git.git] / t / t5514-fetch-multiple.sh
blob25772c85c5a9a89bf247cfa41cf9d8b127572cd8
1 #!/bin/sh
3 test_description='fetch --all works correctly'
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
8 . ./test-lib.sh
10 setup_repository () {
11 mkdir "$1" && (
12 cd "$1" &&
13 git init &&
14 >file &&
15 git add file &&
16 test_tick &&
17 git commit -m "Initial" &&
18 git checkout -b side &&
19 >elif &&
20 git add elif &&
21 test_tick &&
22 git commit -m "Second" &&
23 git checkout main
27 setup_test_clone () {
28 test_dir="$1" &&
29 git clone one "$test_dir" &&
30 for r in one two three
32 git -C "$test_dir" remote add "$r" "../$r" || return 1
33 done
36 test_expect_success setup '
37 setup_repository one &&
38 setup_repository two &&
40 cd two && git branch another
41 ) &&
42 git clone --mirror two three &&
43 git clone one test
46 cat > test/expect << EOF
47 one/main
48 one/side
49 origin/HEAD -> origin/main
50 origin/main
51 origin/side
52 three/another
53 three/main
54 three/side
55 two/another
56 two/main
57 two/side
58 EOF
60 test_expect_success 'git fetch --all' '
61 (cd test &&
62 git remote add one ../one &&
63 git remote add two ../two &&
64 git remote add three ../three &&
65 git fetch --all &&
66 git branch -r > output &&
67 test_cmp expect output)
70 test_expect_success 'git fetch --all --no-write-fetch-head' '
71 (cd test &&
72 rm -f .git/FETCH_HEAD &&
73 git fetch --all --no-write-fetch-head &&
74 test_path_is_missing .git/FETCH_HEAD)
77 test_expect_success 'git fetch --all should continue if a remote has errors' '
78 (git clone one test2 &&
79 cd test2 &&
80 git remote add bad ../non-existing &&
81 git remote add one ../one &&
82 git remote add two ../two &&
83 git remote add three ../three &&
84 test_must_fail git fetch --all &&
85 git branch -r > output &&
86 test_cmp ../test/expect output)
89 test_expect_success 'git fetch --all does not allow non-option arguments' '
90 (cd test &&
91 test_must_fail git fetch --all origin &&
92 test_must_fail git fetch --all origin main)
95 cat > expect << EOF
96 origin/HEAD -> origin/main
97 origin/main
98 origin/side
99 three/another
100 three/main
101 three/side
104 test_expect_success 'git fetch --multiple (but only one remote)' '
105 (git clone one test3 &&
106 cd test3 &&
107 git remote add three ../three &&
108 git fetch --multiple three &&
109 git branch -r > output &&
110 test_cmp ../expect output)
113 cat > expect << EOF
114 one/main
115 one/side
116 two/another
117 two/main
118 two/side
121 test_expect_success 'git fetch --multiple (two remotes)' '
122 (git clone one test4 &&
123 cd test4 &&
124 git remote rm origin &&
125 git remote add one ../one &&
126 git remote add two ../two &&
127 GIT_TRACE=1 git fetch --multiple one two 2>trace &&
128 git branch -r > output &&
129 test_cmp ../expect output &&
130 grep "built-in: git maintenance" trace >gc &&
131 test_line_count = 1 gc
135 test_expect_success 'git fetch --multiple (bad remote names)' '
136 (cd test4 &&
137 test_must_fail git fetch --multiple four)
141 test_expect_success 'git fetch --all (skipFetchAll)' '
142 (cd test4 &&
143 for b in $(git branch -r)
145 git branch -r -d $b || exit 1
146 done &&
147 git remote add three ../three &&
148 git config remote.three.skipFetchAll true &&
149 git fetch --all &&
150 git branch -r > output &&
151 test_cmp ../expect output)
154 cat > expect << EOF
155 one/main
156 one/side
157 three/another
158 three/main
159 three/side
160 two/another
161 two/main
162 two/side
165 test_expect_success 'git fetch --multiple (ignoring skipFetchAll)' '
166 (cd test4 &&
167 for b in $(git branch -r)
169 git branch -r -d $b || exit 1
170 done &&
171 git fetch --multiple one two three &&
172 git branch -r > output &&
173 test_cmp ../expect output)
176 test_expect_success 'git fetch --all --no-tags' '
177 git clone one test5 &&
178 git clone test5 test6 &&
179 (cd test5 && git tag test-tag) &&
181 cd test6 &&
182 git fetch --all --no-tags &&
183 git tag >output
184 ) &&
185 test_must_be_empty test6/output
188 test_expect_success 'git fetch --all --tags' '
189 echo test-tag >expect &&
190 git clone one test7 &&
191 git clone test7 test8 &&
193 cd test7 &&
194 test_commit test-tag &&
195 git reset --hard HEAD^
196 ) &&
198 cd test8 &&
199 git fetch --all --tags &&
200 git tag >output
201 ) &&
202 test_cmp expect test8/output
205 test_expect_success 'parallel' '
206 git remote add one ./bogus1 &&
207 git remote add two ./bogus2 &&
209 test_must_fail env GIT_TRACE="$PWD/trace" \
210 git fetch --jobs=2 --multiple one two 2>err &&
211 grep "preparing to run up to 2 tasks" trace &&
212 test_grep "could not fetch .one.*128" err &&
213 test_grep "could not fetch .two.*128" err
216 test_expect_success 'git fetch --multiple --jobs=0 picks a default' '
217 (cd test &&
218 git fetch --multiple --jobs=0)
221 create_fetch_all_expect () {
222 cat >expect <<-\EOF
223 one/main
224 one/side
225 origin/HEAD -> origin/main
226 origin/main
227 origin/side
228 three/another
229 three/main
230 three/side
231 two/another
232 two/main
233 two/side
237 for fetch_all in true false
239 test_expect_success "git fetch --all (works with fetch.all = $fetch_all)" '
240 test_dir="test_fetch_all_$fetch_all" &&
241 setup_test_clone "$test_dir" &&
243 cd "$test_dir" &&
244 git config fetch.all $fetch_all &&
245 git fetch --all &&
246 create_fetch_all_expect &&
247 git branch -r >actual &&
248 test_cmp expect actual
251 done
253 test_expect_success 'git fetch (fetch all remotes with fetch.all = true)' '
254 setup_test_clone test9 &&
256 cd test9 &&
257 git config fetch.all true &&
258 git fetch &&
259 git branch -r >actual &&
260 create_fetch_all_expect &&
261 test_cmp expect actual
265 create_fetch_one_expect () {
266 cat >expect <<-\EOF
267 one/main
268 one/side
269 origin/HEAD -> origin/main
270 origin/main
271 origin/side
275 test_expect_success 'git fetch one (explicit remote overrides fetch.all)' '
276 setup_test_clone test10 &&
278 cd test10 &&
279 git config fetch.all true &&
280 git fetch one &&
281 create_fetch_one_expect &&
282 git branch -r >actual &&
283 test_cmp expect actual
287 create_fetch_two_as_origin_expect () {
288 cat >expect <<-\EOF
289 origin/HEAD -> origin/main
290 origin/another
291 origin/main
292 origin/side
296 test_expect_success 'git config fetch.all false (fetch only default remote)' '
297 setup_test_clone test11 &&
299 cd test11 &&
300 git config fetch.all false &&
301 git remote set-url origin ../two &&
302 git fetch &&
303 create_fetch_two_as_origin_expect &&
304 git branch -r >actual &&
305 test_cmp expect actual
309 for fetch_all in true false
311 test_expect_success "git fetch --no-all (fetch only default remote with fetch.all = $fetch_all)" '
312 test_dir="test_no_all_fetch_all_$fetch_all" &&
313 setup_test_clone "$test_dir" &&
315 cd "$test_dir" &&
316 git config fetch.all $fetch_all &&
317 git remote set-url origin ../two &&
318 git fetch --no-all &&
319 create_fetch_two_as_origin_expect &&
320 git branch -r >actual &&
321 test_cmp expect actual
324 done
326 test_expect_success 'git fetch --no-all (fetch only default remote without fetch.all)' '
327 setup_test_clone test12 &&
329 cd test12 &&
330 git config --unset-all fetch.all || true &&
331 git remote set-url origin ../two &&
332 git fetch --no-all &&
333 create_fetch_two_as_origin_expect &&
334 git branch -r >actual &&
335 test_cmp expect actual
339 test_expect_success 'git fetch --all --no-all (fetch only default remote)' '
340 setup_test_clone test13 &&
342 cd test13 &&
343 git remote set-url origin ../two &&
344 git fetch --all --no-all &&
345 create_fetch_two_as_origin_expect &&
346 git branch -r >actual &&
347 test_cmp expect actual
351 test_expect_success 'git fetch --no-all one (fetch only explicit remote)' '
352 setup_test_clone test14 &&
354 cd test14 &&
355 git fetch --no-all one &&
356 create_fetch_one_expect &&
357 git branch -r >actual &&
358 test_cmp expect actual
362 test_expect_success 'git fetch --no-all --all (fetch all remotes)' '
363 setup_test_clone test15 &&
365 cd test15 &&
366 git fetch --no-all --all &&
367 create_fetch_all_expect &&
368 git branch -r >actual &&
369 test_cmp expect actual
373 test_done