summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Turner <dturner@twopensource.com>2016-04-15 15:19:09 -0400
committerJunio C Hamano <gitster@pobox.com>2016-04-18 11:46:05 -0700
commit771dcaaee911d3cf2460a750e60ce611950d027e (patch)
treefda7ebbe114974f5bb0a114fa239219642d112c4
parentfa16ec8aaa3247e8bd271b1728f6b59df1649194 (diff)
downloadgit-dt/http-fetch-limit-advertisement.tar.gz
clone: send refspec for single-branch clonesdt/http-fetch-limit-advertisement
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 <dturner@twopensource.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/clone.c16
-rwxr-xr-xt/t5552-http-fetch-branch.sh5
-rw-r--r--transport-helper.c12
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;
}