bundle-uri client: add boolean transfer.bundleURI setting

The yet-to-be introduced client support for bundle-uri will always
fall back on a full clone, but we'd still like to be able to ignore a
server's bundle-uri advertisement entirely.

The new transfer.bundleURI config option defaults to 'false', but a user
can set it to 'true' to enable checking for bundle URIs from the origin
Git server using protocol v2.

Co-authored-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason
2022-12-22 15:14:10 +00:00
committed by Junio C Hamano
parent 0cfde740f0
commit 7cce9074a7
3 changed files with 32 additions and 1 deletions

View File

@ -115,3 +115,9 @@ transfer.unpackLimit::
transfer.advertiseSID:: transfer.advertiseSID::
Boolean. When true, client and server processes will advertise their Boolean. When true, client and server processes will advertise their
unique session IDs to their remote counterpart. Defaults to false. unique session IDs to their remote counterpart. Defaults to false.
transfer.bundleURI::
When `true`, local `git clone` commands will request bundle
information from the remote server (if advertised) and download
bundles before continuing the clone through the Git protocol.
Defaults to `false`.

View File

@ -85,10 +85,11 @@ test_expect_success "connect with $BUNDLE_URI_PROTOCOL:// using protocol v2: hav
' '
test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: request bundle-uris" ' test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: request bundle-uris" '
test_when_finished "rm -rf log cloned" && test_when_finished "rm -rf log cloned cloned2" &&
GIT_TRACE_PACKET="$PWD/log" \ GIT_TRACE_PACKET="$PWD/log" \
git \ git \
-c transfer.bundleURI=false \
-c protocol.version=2 \ -c protocol.version=2 \
clone "$BUNDLE_URI_REPO_URI" cloned \ clone "$BUNDLE_URI_REPO_URI" cloned \
>actual 2>err && >actual 2>err &&
@ -99,6 +100,22 @@ test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: reque
# Server advertised bundle-uri capability # Server advertised bundle-uri capability
grep "< bundle-uri" log && grep "< bundle-uri" log &&
# Client did not issue bundle-uri command
! grep "> command=bundle-uri" log &&
GIT_TRACE_PACKET="$PWD/log" \
git \
-c transfer.bundleURI=true \
-c protocol.version=2 \
clone "$BUNDLE_URI_REPO_URI" cloned2 \
>actual 2>err &&
# Server responded using protocol v2
grep "< version 2" log &&
# Server advertised bundle-uri capability
grep "< bundle-uri" log &&
# Client issued bundle-uri command # Client issued bundle-uri command
grep "> command=bundle-uri" log grep "> command=bundle-uri" log
' '

View File

@ -1516,6 +1516,7 @@ int transport_fetch_refs(struct transport *transport, struct ref *refs)
int transport_get_remote_bundle_uri(struct transport *transport) int transport_get_remote_bundle_uri(struct transport *transport)
{ {
int value = 0;
const struct transport_vtable *vtable = transport->vtable; const struct transport_vtable *vtable = transport->vtable;
/* Check config only once. */ /* Check config only once. */
@ -1523,6 +1524,13 @@ int transport_get_remote_bundle_uri(struct transport *transport)
return 0; return 0;
transport->got_remote_bundle_uri = 1; transport->got_remote_bundle_uri = 1;
/*
* Don't request bundle-uri from the server unless configured to
* do so by the transfer.bundleURI=true config option.
*/
if (git_config_get_bool("transfer.bundleuri", &value) || !value)
return 0;
if (!vtable->get_bundle_uri) if (!vtable->get_bundle_uri)
return error(_("bundle-uri operation not supported by protocol")); return error(_("bundle-uri operation not supported by protocol"));