fetch: add new config option fetch.all

Introduce a boolean configuration option fetch.all which allows to
fetch all available remotes by default. The config option can be
overridden by explicitly specifying a remote or by using --no-all.
The behavior for --all is unchanged and calling git-fetch with --all
and a remote will still result in an error.

Additionally, describe the configuration variable in the config
documentation and implement new tests to cover the expected behavior.
Also add --no-all to the command-line documentation of git-fetch.

Signed-off-by: Tamino Bauknecht <dev@tb6.eu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Tamino Bauknecht
2024-01-08 22:13:55 +01:00
committed by Junio C Hamano
parent a26002b628
commit 39487a1510
4 changed files with 186 additions and 3 deletions

View File

@@ -24,6 +24,15 @@ setup_repository () {
)
}
setup_test_clone () {
test_dir="$1" &&
git clone one "$test_dir" &&
for r in one two three
do
git -C "$test_dir" remote add "$r" "../$r" || return 1
done
}
test_expect_success setup '
setup_repository one &&
setup_repository two &&
@@ -209,4 +218,156 @@ test_expect_success 'git fetch --multiple --jobs=0 picks a default' '
git fetch --multiple --jobs=0)
'
create_fetch_all_expect () {
cat >expect <<-\EOF
one/main
one/side
origin/HEAD -> origin/main
origin/main
origin/side
three/another
three/main
three/side
two/another
two/main
two/side
EOF
}
for fetch_all in true false
do
test_expect_success "git fetch --all (works with fetch.all = $fetch_all)" '
test_dir="test_fetch_all_$fetch_all" &&
setup_test_clone "$test_dir" &&
(
cd "$test_dir" &&
git config fetch.all $fetch_all &&
git fetch --all &&
create_fetch_all_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
done
test_expect_success 'git fetch (fetch all remotes with fetch.all = true)' '
setup_test_clone test9 &&
(
cd test9 &&
git config fetch.all true &&
git fetch &&
git branch -r >actual &&
create_fetch_all_expect &&
test_cmp expect actual
)
'
create_fetch_one_expect () {
cat >expect <<-\EOF
one/main
one/side
origin/HEAD -> origin/main
origin/main
origin/side
EOF
}
test_expect_success 'git fetch one (explicit remote overrides fetch.all)' '
setup_test_clone test10 &&
(
cd test10 &&
git config fetch.all true &&
git fetch one &&
create_fetch_one_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
create_fetch_two_as_origin_expect () {
cat >expect <<-\EOF
origin/HEAD -> origin/main
origin/another
origin/main
origin/side
EOF
}
test_expect_success 'git config fetch.all false (fetch only default remote)' '
setup_test_clone test11 &&
(
cd test11 &&
git config fetch.all false &&
git remote set-url origin ../two &&
git fetch &&
create_fetch_two_as_origin_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
for fetch_all in true false
do
test_expect_success "git fetch --no-all (fetch only default remote with fetch.all = $fetch_all)" '
test_dir="test_no_all_fetch_all_$fetch_all" &&
setup_test_clone "$test_dir" &&
(
cd "$test_dir" &&
git config fetch.all $fetch_all &&
git remote set-url origin ../two &&
git fetch --no-all &&
create_fetch_two_as_origin_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
done
test_expect_success 'git fetch --no-all (fetch only default remote without fetch.all)' '
setup_test_clone test12 &&
(
cd test12 &&
git config --unset-all fetch.all || true &&
git remote set-url origin ../two &&
git fetch --no-all &&
create_fetch_two_as_origin_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
test_expect_success 'git fetch --all --no-all (fetch only default remote)' '
setup_test_clone test13 &&
(
cd test13 &&
git remote set-url origin ../two &&
git fetch --all --no-all &&
create_fetch_two_as_origin_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
test_expect_success 'git fetch --no-all one (fetch only explicit remote)' '
setup_test_clone test14 &&
(
cd test14 &&
git fetch --no-all one &&
create_fetch_one_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
test_expect_success 'git fetch --no-all --all (fetch all remotes)' '
setup_test_clone test15 &&
(
cd test15 &&
git fetch --no-all --all &&
create_fetch_all_expect &&
git branch -r >actual &&
test_cmp expect actual
)
'
test_done