Re: [PATCH/RFC 5/6] fetch: pass refspec to http server

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, 2016-04-16 at 22:33 -0400, Eric Sunshine wrote:
> 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.

Yep, good point.

> > +               }
> > +       }
> > +
> > +       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.

Thanks.

> > +               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 ...


Will fix these, thanks.
--
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



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]