On Fri, Apr 15, 2016 at 3:19 PM, David Turner <[email protected]> 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 <[email protected]>
> ---
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html