From: Junio C Hamano <gitster@pobox.com>
To: Stefan Beller <sbeller@google.com>
Cc: git@vger.kernel.org, pclouds@gmail.com, peff@peff.net
Subject: Re: [RFCv2 04/16] upload-pack-2: Implement the version 2 of upload-pack
Date: Tue, 02 Jun 2015 11:59:02 -0700 [thread overview]
Message-ID: <xmqqfv6a2ayx.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1433203338-27493-5-git-send-email-sbeller@google.com> (Stefan Beller's message of "Mon, 1 Jun 2015 17:02:06 -0700")
Stefan Beller <sbeller@google.com> writes:
> Subject: [RFCv2 04/16] upload-pack-2: Implement the version 2 of upload-pack
Nit; s/I/i/, to match others in the series, I think.
> In upload-pack-2 we send each capability in its own packet buffer.
>
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>
> Notes:
> Moved the capabilities into a struct containing all the capabilities,
> and then we selectively cancel out unwanted capabilities.
> diff --git a/upload-pack-2.c b/upload-pack-2.c
> new file mode 120000
> index 0000000..e30a871
> --- /dev/null
> +++ b/upload-pack-2.c
> @@ -0,0 +1 @@
> +upload-pack.c
> \ No newline at end of file
Yuck.
Can't we do an equivalent without this symbolic link, i.e. a new
Makefile rule to compile upload-pack.c in two different ways to two
different object files?
The way this patch is organized makes it unclear which part is what
was added for v2 and which part is shared with v1 (and changes can
be possible breakage to the existing code), leading to a patch that
is hard to review.
> diff --git a/upload-pack.c b/upload-pack.c
> index 2493964..7477ca3 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -716,33 +716,69 @@ static void format_symref_info(struct strbuf *buf, struct string_list *symref)
> strbuf_addf(buf, " symref=%s:%s", item->string, (char *)item->util);
> }
>
> +static int advertise_capabilities = 1;
> +const char *all_capabilities[] = {
> + "multi_ack",
> + "thin-pack",
> + "side-band",
> + "side-band-64k",
> + "ofs-delta",
> + "shallow",
> + "no-progress",
> + "include-tag",
> + "multi_ack_detailed",
> + "allow-tip-sha1-in-want",
> + "no-done",
> +};
> +
> +static void send_capabilities(void)
This looks like send-capabilities-v2. I am OK to share code between
v1 and v2 by having two implementations in the same file and some
(or major part of) helper functions or overall structure code shared
between the two, but if you are taking that route, a version specific
helper like this needs to be made clear which one is which.
> +{
> + int i;
> + for (i = 0; i < ARRAY_SIZE(all_capabilities); i++) {
> + const char *cap = all_capabilities[i];
> + if (!strcmp(cap, "allow-tip-sha1-in-want") && !allow_tip_sha1_in_want)
> + continue;
> + if (!strcmp(cap, "no-done") && !stateless_rpc)
> + continue;
> + packet_write(1,"%s", cap);
s/1,/1, /;
> static int send_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
> {
> - static const char *capabilities = "multi_ack thin-pack side-band"
> - " side-band-64k ofs-delta shallow no-progress"
> - " include-tag multi_ack_detailed";
> +
And is this one only for v1?
> const char *refname_nons = strip_namespace(refname);
> unsigned char peeled[20];
>
> if (mark_our_ref(refname, sha1))
> return 0;
>
> - if (capabilities) {
> - struct strbuf symref_info = STRBUF_INIT;
> -
> - format_symref_info(&symref_info, cb_data);
> - packet_write(1, "%s %s%c%s%s%s%s agent=%s\n",
> - sha1_to_hex(sha1), refname_nons,
> - 0, capabilities,
> - allow_tip_sha1_in_want ? " allow-tip-sha1-in-want" : "",
> - stateless_rpc ? " no-done" : "",
> - symref_info.buf,
> - git_user_agent_sanitized());
> - strbuf_release(&symref_info);
> + if (advertise_capabilities) {
> + int i;
> + struct strbuf capabilities = STRBUF_INIT;
> +
> + for (i = 0; i < ARRAY_SIZE(all_capabilities); i++) {
> + const char *cap = all_capabilities[i];
> + if (!strcmp(cap, "allow-tip-sha1-in-want") && !allow_tip_sha1_in_want)
> + continue;
> + if (!strcmp(cap, "no-done") && !stateless_rpc)
> + continue;
> + strbuf_addf(&capabilities, " %s", cap);
> + }
> +
> + format_symref_info(&capabilities, cb_data);
> + strbuf_addf(&capabilities, " agent=%s", git_user_agent_sanitized());
> +
> + packet_write(1, "%s %s%c%s\n", sha1_to_hex(sha1), refname_nons,
> + 0, capabilities.buf);
> + strbuf_release(&capabilities);
> + advertise_capabilities = 0;
The change itself may be going in the right direction, but I'd
suggest doing this in two steps:
* refactor existing v1 without adding anything v2 specific
(e.g. send-capabilities above). A new file-scope global
all_capabilities[] array, use of it in this new implementation of
send_ref(), and introduction of the separate
advertise_capabilities bool, are good examples of refactoring of
v1.
* then on top of that solid foundation, add v2 specific stuff.
next prev parent reply other threads:[~2015-06-02 18:59 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-02 0:02 [RFCv2 00/16] Protocol version 2 Stefan Beller
2015-06-02 0:02 ` [RFCv2 01/16] stringlist: add from_space_separated_string Stefan Beller
2015-06-02 9:42 ` Duy Nguyen
2015-06-02 15:10 ` Eric Sunshine
2015-06-02 17:54 ` Stefan Beller
2015-06-02 0:02 ` [RFCv2 02/16] upload-pack: make client capability parsing code a separate function Stefan Beller
2015-06-02 0:02 ` [RFCv2 03/16] connect: rewrite feature parsing to work on string_list Stefan Beller
2015-06-02 18:48 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 04/16] upload-pack-2: Implement the version 2 of upload-pack Stefan Beller
2015-06-02 18:59 ` Junio C Hamano [this message]
2015-06-02 23:08 ` Stefan Beller
2015-06-02 0:02 ` [RFCv2 05/16] remote.h: Change get_remote_heads return to void Stefan Beller
2015-06-02 21:17 ` Junio C Hamano
2015-06-02 21:25 ` Stefan Beller
2015-06-02 21:41 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 06/16] remote.h: add new struct for options Stefan Beller
2015-06-02 21:18 ` Junio C Hamano
2015-06-02 21:40 ` Stefan Beller
2015-06-02 21:43 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 07/16] transport: add infrastructure to support a protocol version number Stefan Beller
2015-06-02 0:02 ` [RFCv2 08/16] transport: select transport version via command line or config Stefan Beller
2015-06-02 0:02 ` [RFCv2 09/16] remote.h: add get_remote_capabilities, request_capabilities Stefan Beller
2015-06-02 21:24 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 10/16] transport: connect_setup appends protocol version number Stefan Beller
2015-06-02 9:58 ` Duy Nguyen
2015-06-02 18:04 ` Stefan Beller
2015-06-02 21:37 ` Junio C Hamano
2015-06-02 22:09 ` Stefan Beller
2015-06-02 22:27 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 11/16] remote: have preselect_capabilities Stefan Beller
2015-06-02 21:45 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 12/16] transport: get_refs_via_connect exchanges capabilities before refs Stefan Beller
2015-06-02 21:55 ` Junio C Hamano
2015-06-02 22:19 ` Stefan Beller
2015-06-02 0:02 ` [RFCv2 13/16] fetch-pack: use the configured transport protocol Stefan Beller
2015-06-02 9:55 ` Duy Nguyen
2015-06-02 10:02 ` Duy Nguyen
2015-06-02 11:32 ` Ilari Liusvaara
2015-06-02 0:02 ` [RFCv2 14/16] t5544: add a test case for the new protocol Stefan Beller
2015-06-03 0:16 ` Eric Sunshine
2015-06-02 0:02 ` [RFCv2 15/16] Documentation/technical/pack-protocol: Mention http as possible protocol Stefan Beller
2015-06-02 21:57 ` Junio C Hamano
2015-06-02 22:00 ` Junio C Hamano
2015-06-02 0:02 ` [RFCv2 16/16] Document protocol version 2 Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqfv6a2ayx.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.