Re: [PATCH/RFC 5/6] fetch: pass refspec to http server
On Fri, Apr 15, 2016 at 3:19 PM, David Turner <dturner@twopensource.com> wrote:
Show 21 quoted lines
> 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@twopensource.com>
> ---
> 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.
Show 18 quoted lines
> + }
> + }
> +
> + 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 3Show 13 quoted lines
> + 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 ...