From 771dcaaee911d3cf2460a750e60ce611950d027e Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 15 Apr 2016 15:19:09 -0400 Subject: clone: send refspec for single-branch clones For single-branch clones (when we know in advance what the remote branch name will be), send a refspec so that the server doesn't tell us about any other refs. Signed-off-by: David Turner Signed-off-by: Junio C Hamano --- builtin/clone.c | 16 +++++++++++++++- t/t5552-http-fetch-branch.sh | 5 +++++ transport-helper.c | 12 +++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/builtin/clone.c b/builtin/clone.c index ebced775df..7540e1027e 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -1017,7 +1017,21 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (transport->smart_options && !option_depth) transport->smart_options->check_self_contained_and_connected = 1; - refs = transport_get_remote_refs(transport, NULL, 0); + if (option_single_branch && option_branch) { + struct refspec branch_refspec = {0}; + + if (starts_with(option_branch, "refs/")) { + branch_refspec.src = xstrdup(option_branch); + } else { + struct strbuf buf = STRBUF_INIT; + strbuf_addf(&buf, "refs/heads/%s", option_branch); + branch_refspec.src = strbuf_detach(&buf, NULL); + } + refs = transport_get_remote_refs(transport, &branch_refspec, 1); + free(branch_refspec.src); + } else { + refs = transport_get_remote_refs(transport, NULL, 0); + } if (refs) { mapped_refs = wanted_peer_refs(refs, refspec); diff --git a/t/t5552-http-fetch-branch.sh b/t/t5552-http-fetch-branch.sh index 0e905d90b7..8a8e218c1d 100755 --- a/t/t5552-http-fetch-branch.sh +++ b/t/t5552-http-fetch-branch.sh @@ -38,5 +38,10 @@ test_expect_success 'fetch with refspec only fetches requested branch' ' ) ' +test_expect_success 'single-branch clone only fetches requested branch' ' + GIT_TRACE_PACKET="$TRASH_DIRECTORY/trace" git clone --single-branch -b master $HTTPD_URL/smart/repo.git sbc && + ! grep "refs/heads/another_branch" trace +' + stop_httpd test_done diff --git a/transport-helper.c b/transport-helper.c index 7d75d64744..3775d63aff 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -28,6 +28,7 @@ struct helper_data { signed_tags : 1, check_connectivity : 1, no_disconnect_req : 1, + refspec : 1, no_private_update : 1; char *export_marks; char *import_marks; @@ -114,8 +115,15 @@ static struct child_process *get_helper(struct transport *transport, const struc int code; int i; - if (data->helper) + if (data->helper) { + if (!data->refspec && req_refspec_nr) { + for (i = 0; i < req_refspec_nr; i++) + set_helper_option(transport, "refspec", + req_refspecs[i].src); + data->refspec = 1; + } return data->helper; + } helper = xmalloc(sizeof(*helper)); child_process_init(helper); @@ -220,6 +228,8 @@ static struct child_process *get_helper(struct transport *transport, const struc for (i = 0; i < req_refspec_nr; i++) set_helper_option(transport, "refspec", req_refspecs[i].src); + if (req_refspec_nr) + data->refspec = 1; standard_options(transport); return data->helper; } -- cgit v1.2.1