clone: send server options when using protocol v2

Commit 5e3548ef16 ("fetch: send server options when using protocol v2",
2018-04-24) taught "fetch" the ability to send server options when using
protocol v2, but not "clone". This ability is triggered by "-o" or
"--server-option".

Teach "clone" the same ability, except that because "clone" already
has "-o" for another parameter, teach "clone" only to receive
"--server-option".

Explain in the documentation, both for clone and for fetch, that server
handling of server options are server-specific. This is similar to
receive-pack's handling of push options - currently, they are just sent
to hooks to interpret as they see fit.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Tan 2019-04-12 12:51:22 -07:00 committed by Junio C Hamano
parent 35eb8240b0
commit 6e98305985
4 changed files with 38 additions and 1 deletions

View File

@ -216,7 +216,8 @@ endif::git-pull[]
--server-option=<option>:: --server-option=<option>::
Transmit the given string to the server when communicating using Transmit the given string to the server when communicating using
protocol version 2. The given string must not contain a NUL or LF protocol version 2. The given string must not contain a NUL or LF
character. character. The server's handling of server options, including
unknown ones, is server-specific.
When multiple `--server-option=<option>` are given, they are all When multiple `--server-option=<option>` are given, they are all
sent to the other side in the order listed on the command line. sent to the other side in the order listed on the command line.

View File

@ -131,6 +131,14 @@ objects from the source repository into a pack in the cloned repository.
is specified. This flag forces progress status even if the is specified. This flag forces progress status even if the
standard error stream is not directed to a terminal. standard error stream is not directed to a terminal.
--server-option=<option>::
Transmit the given string to the server when communicating using
protocol version 2. The given string must not contain a NUL or LF
character. The server's handling of server options, including
unknown ones, is server-specific.
When multiple `--server-option=<option>` are given, they are all
sent to the other side in the order listed on the command line.
--no-checkout:: --no-checkout::
-n:: -n::
No checkout of HEAD is performed after the clone is complete. No checkout of HEAD is performed after the clone is complete.

View File

@ -66,6 +66,7 @@ static int option_dissociate;
static int max_jobs = -1; static int max_jobs = -1;
static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP; static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP;
static struct list_objects_filter_options filter_options; static struct list_objects_filter_options filter_options;
static struct string_list server_options = STRING_LIST_INIT_NODUP;
static int recurse_submodules_cb(const struct option *opt, static int recurse_submodules_cb(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
@ -137,6 +138,8 @@ static struct option builtin_clone_options[] = {
N_("separate git dir from working tree")), N_("separate git dir from working tree")),
OPT_STRING_LIST('c', "config", &option_config, N_("key=value"), OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
N_("set config inside the new repository")), N_("set config inside the new repository")),
OPT_STRING_LIST(0, "server-option", &server_options,
N_("server-specific"), N_("option to transmit")),
OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"), OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
TRANSPORT_FAMILY_IPV4), TRANSPORT_FAMILY_IPV4),
OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"), OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
@ -1136,6 +1139,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
transport_set_option(transport, TRANS_OPT_UPLOADPACK, transport_set_option(transport, TRANS_OPT_UPLOADPACK,
option_upload_pack); option_upload_pack);
if (server_options.nr)
transport->server_options = &server_options;
if (filter_options.choice) { if (filter_options.choice) {
struct strbuf expanded_filter_spec = STRBUF_INIT; struct strbuf expanded_filter_spec = STRBUF_INIT;
expand_list_objects_filter_spec(&filter_options, expand_list_objects_filter_spec(&filter_options,

View File

@ -270,6 +270,28 @@ test_expect_success 'warn if using server-option with fetch with legacy protocol
test_i18ngrep "server options require protocol version 2 or later" err test_i18ngrep "server options require protocol version 2 or later" err
' '
test_expect_success 'server-options are sent when cloning' '
test_when_finished "rm -rf log myclone" &&
GIT_TRACE_PACKET="$(pwd)/log" git -c protocol.version=2 \
clone --server-option=hello --server-option=world \
"file://$(pwd)/file_parent" myclone &&
grep "server-option=hello" log &&
grep "server-option=world" log
'
test_expect_success 'warn if using server-option with clone with legacy protocol' '
test_when_finished "rm -rf myclone" &&
test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -c protocol.version=0 \
clone --server-option=hello --server-option=world \
"file://$(pwd)/file_parent" myclone 2>err &&
test_i18ngrep "see protocol.version in" err &&
test_i18ngrep "server options require protocol version 2 or later" err
'
test_expect_success 'upload-pack respects config using protocol v2' ' test_expect_success 'upload-pack respects config using protocol v2' '
git init server && git init server &&
write_script server/.git/hook <<-\EOF && write_script server/.git/hook <<-\EOF &&