On Fri, Apr 15, 2016 at 3:19 PM, David Turner <dturner@xxxxxxxxxxxxxxxx> wrote: > When fetching over http, send the requested refspec to the server. > The server will then only send refs matching that refspec. It is > permitted for old servers to ignore that parameter, and the client > will automatically handle this. > > When the server has many refs, and the client only wants a few, this > can save bandwidth and reduce fetch latency. > > Signed-off-by: David Turner <dturner@xxxxxxxxxxxxxxxx> > --- > diff --git a/builtin/fetch.c b/builtin/fetch.c > @@ -302,9 +302,27 @@ static struct ref *get_ref_map(struct transport *transport, > - remote_refs = transport_get_remote_refs(transport, NULL, 0); > + qualified_refspecs = xcalloc(refspec_count, sizeof(*qualified_refspecs)); > + for (i = 0; i < refspec_count; i++) { > + if (starts_with(refspecs[i].src, "refs/")) { > + qualified_refspecs[i].src = xstrdup(refspecs[i].src); > + } else { > + struct strbuf buf = STRBUF_INIT; > + strbuf_addf(&buf, "refs/heads/%s", refspecs[i].src); > + qualified_refspecs[i].src = strbuf_detach(&buf, NULL); Alternately, replace these three lines with: qualified_refspecs[i].src = xstrfmt("refs/heads/%s", refspecs[i].src); and drop the braces. > + } > + } > + > + remote_refs = transport_get_remote_refs(transport, qualified_refspecs, > + refspec_count); > + > + for (i = 0; i < refspec_count; i++) { > + free(qualified_refspecs[i].src); > + } > + free(qualified_refspecs); > diff --git a/t/t5552-http-fetch-branch.sh b/t/t5552-http-fetch-branch.sh > @@ -0,0 +1,42 @@ > +test_expect_success 'make some more commits' ' > + ( > + cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && > + test_commit 2 && > + git checkout -b another_branch && > + test_commit 3 Broken &&-chain. > + git checkout -b a_third_branch && > + test_commit 4 > + ) > +' > + > +test_expect_success 'fetch with refspec only fetches requested branch' ' > + test_when_finished "rm trace" && > + ( > + cd clone && > + GIT_TRACE_PACKET="$TRASH_DIRECTORY/trace" git fetch origin another_branch && > + ! grep "refs/heads/master" ../trace > + ) > +' This could be done without the subshell, perhaps? GIT_TRACE_PACKET=blah git -C clone fetch ... -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html