Skip to content

Commit

Permalink
fetch: send server options when using protocol v2
Browse files Browse the repository at this point in the history
Teach fetch to optionally accept server options by specifying them on
the cmdline via '-o' or '--server-option'.  These server options are
sent to the remote end when performing a fetch communicating using
protocol version 2.

If communicating using a protocol other than v2 the provided options are
ignored and not sent to the remote end.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
bmwill authored and gitster committed Apr 24, 2018
1 parent ff47322 commit 5e3548e
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Documentation/fetch-options.txt
Expand Up @@ -188,6 +188,14 @@ endif::git-pull[]
is specified. This flag forces progress status even if the
standard error stream is not directed to a terminal.

-o <option>::
--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.
When multiple `--server-option=<option>` are given, they are all
sent to the other side in the order listed on the command line.

-4::
--ipv4::
Use IPv4 addresses only, ignoring IPv6 addresses.
Expand Down
5 changes: 5 additions & 0 deletions builtin/fetch.c
Expand Up @@ -62,6 +62,7 @@ static int shown_url = 0;
static int refmap_alloc, refmap_nr;
static const char **refmap_array;
static struct list_objects_filter_options filter_options;
static struct string_list server_options = STRING_LIST_INIT_DUP;

static int git_fetch_config(const char *k, const char *v, void *cb)
{
Expand Down Expand Up @@ -170,6 +171,7 @@ static struct option builtin_fetch_options[] = {
N_("accept refs that update .git/shallow")),
{ OPTION_CALLBACK, 0, "refmap", NULL, N_("refmap"),
N_("specify fetch refmap"), PARSE_OPT_NONEG, parse_refmap_arg },
OPT_STRING_LIST('o', "server-option", &server_options, N_("server-specific"), N_("option to transmit")),
OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
TRANSPORT_FAMILY_IPV4),
OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
Expand Down Expand Up @@ -1417,6 +1419,9 @@ static int fetch_one(struct remote *remote, int argc, const char **argv, int pru
}
}

if (server_options.nr)
gtransport->server_options = &server_options;

sigchain_push_common(unlock_pack_on_signal);
atexit(unlock_pack);
refspec = parse_fetch_refspec(ref_nr, refs);
Expand Down
7 changes: 7 additions & 0 deletions fetch-pack.c
Expand Up @@ -1174,6 +1174,13 @@ static int send_fetch_request(int fd_out, const struct fetch_pack_args *args,
packet_buf_write(&req_buf, "command=fetch");
if (server_supports_v2("agent", 0))
packet_buf_write(&req_buf, "agent=%s", git_user_agent_sanitized());
if (args->server_options && args->server_options->nr &&
server_supports_v2("server-option", 1)) {
int i;
for (i = 0; i < args->server_options->nr; i++)
packet_write_fmt(fd_out, "server-option=%s",
args->server_options->items[i].string);
}

packet_buf_delim(&req_buf);
if (args->use_thin_pack)
Expand Down
1 change: 1 addition & 0 deletions fetch-pack.h
Expand Up @@ -15,6 +15,7 @@ struct fetch_pack_args {
const char *deepen_since;
const struct string_list *deepen_not;
struct list_objects_filter_options filter_options;
const struct string_list *server_options;
unsigned deepen_relative:1;
unsigned quiet:1;
unsigned keep_pack:1;
Expand Down
16 changes: 16 additions & 0 deletions t/t5702-protocol-v2.sh
Expand Up @@ -217,6 +217,22 @@ test_expect_success 'ref advertisment is filtered during fetch using protocol v2
! grep "refs/tags/three" log
'

test_expect_success 'server-options are sent when fetching' '
test_when_finished "rm -f log" &&
test_commit -C file_parent four &&
GIT_TRACE_PACKET="$(pwd)/log" git -C file_child -c protocol.version=2 \
fetch -o hello -o world origin master &&
git -C file_child log -1 --format=%s origin/master >actual &&
git -C file_parent log -1 --format=%s >expect &&
test_cmp expect actual &&
grep "server-option=hello" log &&
grep "server-option=world" log
'

# Test protocol v2 with 'http://' transport
#
. "$TEST_DIRECTORY"/lib-httpd.sh
Expand Down
1 change: 1 addition & 0 deletions transport.c
Expand Up @@ -266,6 +266,7 @@ static int fetch_refs_via_pack(struct transport *transport,
args.no_dependents = data->options.no_dependents;
args.filter_options = data->options.filter_options;
args.stateless_rpc = transport->stateless_rpc;
args.server_options = transport->server_options;

if (!data->got_remote_heads)
refs_tmp = get_refs_via_connect(transport, 0, NULL);
Expand Down

0 comments on commit 5e3548e

Please sign in to comment.