c3d6b70338
In multiple remotes mode, git-fetch is launched for n-1 remotes and the last remote is handled by the current process. Each of these processes will in turn run 'gc' at the end. This is not really a problem because even if multiple 'gc --auto' is run at the same time we still handle it correctly. It does show multiple "auto packing in the background" messages though. And we may waste some resources when gc actually runs because we still do some stuff before checking the lock and moving it to background. So let's try to avoid that. We should only need one 'gc' run after all objects and references are added anyway. Add a new option --no-auto-gc that will be used by those n-1 processes. 'gc --auto' will always run on the main fetch process (*). (*) even if we fetch remotes in parallel at some point in future, this should still be fine because we should "join" all those processes before this step. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Acked-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
187 lines
3.6 KiB
Bash
Executable File
187 lines
3.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='fetch --all works correctly'
|
|
|
|
. ./test-lib.sh
|
|
|
|
setup_repository () {
|
|
mkdir "$1" && (
|
|
cd "$1" &&
|
|
git init &&
|
|
>file &&
|
|
git add file &&
|
|
test_tick &&
|
|
git commit -m "Initial" &&
|
|
git checkout -b side &&
|
|
>elif &&
|
|
git add elif &&
|
|
test_tick &&
|
|
git commit -m "Second" &&
|
|
git checkout master
|
|
)
|
|
}
|
|
|
|
test_expect_success setup '
|
|
setup_repository one &&
|
|
setup_repository two &&
|
|
(
|
|
cd two && git branch another
|
|
) &&
|
|
git clone --mirror two three &&
|
|
git clone one test
|
|
'
|
|
|
|
cat > test/expect << EOF
|
|
one/master
|
|
one/side
|
|
origin/HEAD -> origin/master
|
|
origin/master
|
|
origin/side
|
|
three/another
|
|
three/master
|
|
three/side
|
|
two/another
|
|
two/master
|
|
two/side
|
|
EOF
|
|
|
|
test_expect_success 'git fetch --all' '
|
|
(cd test &&
|
|
git remote add one ../one &&
|
|
git remote add two ../two &&
|
|
git remote add three ../three &&
|
|
git fetch --all &&
|
|
git branch -r > output &&
|
|
test_cmp expect output)
|
|
'
|
|
|
|
test_expect_success 'git fetch --all should continue if a remote has errors' '
|
|
(git clone one test2 &&
|
|
cd test2 &&
|
|
git remote add bad ../non-existing &&
|
|
git remote add one ../one &&
|
|
git remote add two ../two &&
|
|
git remote add three ../three &&
|
|
test_must_fail git fetch --all &&
|
|
git branch -r > output &&
|
|
test_cmp ../test/expect output)
|
|
'
|
|
|
|
test_expect_success 'git fetch --all does not allow non-option arguments' '
|
|
(cd test &&
|
|
test_must_fail git fetch --all origin &&
|
|
test_must_fail git fetch --all origin master)
|
|
'
|
|
|
|
cat > expect << EOF
|
|
origin/HEAD -> origin/master
|
|
origin/master
|
|
origin/side
|
|
three/another
|
|
three/master
|
|
three/side
|
|
EOF
|
|
|
|
test_expect_success 'git fetch --multiple (but only one remote)' '
|
|
(git clone one test3 &&
|
|
cd test3 &&
|
|
git remote add three ../three &&
|
|
git fetch --multiple three &&
|
|
git branch -r > output &&
|
|
test_cmp ../expect output)
|
|
'
|
|
|
|
cat > expect << EOF
|
|
one/master
|
|
one/side
|
|
two/another
|
|
two/master
|
|
two/side
|
|
EOF
|
|
|
|
test_expect_success 'git fetch --multiple (two remotes)' '
|
|
(git clone one test4 &&
|
|
cd test4 &&
|
|
git remote rm origin &&
|
|
git remote add one ../one &&
|
|
git remote add two ../two &&
|
|
GIT_TRACE=1 git fetch --multiple one two 2>trace &&
|
|
git branch -r > output &&
|
|
test_cmp ../expect output &&
|
|
grep "built-in: git gc" trace >gc &&
|
|
test_line_count = 1 gc
|
|
)
|
|
'
|
|
|
|
test_expect_success 'git fetch --multiple (bad remote names)' '
|
|
(cd test4 &&
|
|
test_must_fail git fetch --multiple four)
|
|
'
|
|
|
|
|
|
test_expect_success 'git fetch --all (skipFetchAll)' '
|
|
(cd test4 &&
|
|
for b in $(git branch -r)
|
|
do
|
|
git branch -r -d $b || exit 1
|
|
done &&
|
|
git remote add three ../three &&
|
|
git config remote.three.skipFetchAll true &&
|
|
git fetch --all &&
|
|
git branch -r > output &&
|
|
test_cmp ../expect output)
|
|
'
|
|
|
|
cat > expect << EOF
|
|
one/master
|
|
one/side
|
|
three/another
|
|
three/master
|
|
three/side
|
|
two/another
|
|
two/master
|
|
two/side
|
|
EOF
|
|
|
|
test_expect_success 'git fetch --multiple (ignoring skipFetchAll)' '
|
|
(cd test4 &&
|
|
for b in $(git branch -r)
|
|
do
|
|
git branch -r -d $b || exit 1
|
|
done &&
|
|
git fetch --multiple one two three &&
|
|
git branch -r > output &&
|
|
test_cmp ../expect output)
|
|
'
|
|
|
|
test_expect_success 'git fetch --all --no-tags' '
|
|
git clone one test5 &&
|
|
git clone test5 test6 &&
|
|
(cd test5 && git tag test-tag) &&
|
|
(
|
|
cd test6 &&
|
|
git fetch --all --no-tags &&
|
|
git tag >output
|
|
) &&
|
|
test_must_be_empty test6/output
|
|
'
|
|
|
|
test_expect_success 'git fetch --all --tags' '
|
|
echo test-tag >expect &&
|
|
git clone one test7 &&
|
|
git clone test7 test8 &&
|
|
(
|
|
cd test7 &&
|
|
test_commit test-tag &&
|
|
git reset --hard HEAD^
|
|
) &&
|
|
(
|
|
cd test8 &&
|
|
git fetch --all --tags &&
|
|
git tag >output
|
|
) &&
|
|
test_cmp expect test8/output
|
|
'
|
|
|
|
test_done
|