All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Shawn O. Pearce" <spearce@spearce.org>, git@vger.kernel.org
Subject: [PATCH 2/4] do not send client agent unless server does first
Date: Fri, 10 Aug 2012 03:57:43 -0400	[thread overview]
Message-ID: <20120810075743.GB8399@sigill.intra.peff.net> (raw)
In-Reply-To: <20120810075342.GA30072@sigill.intra.peff.net>

Commit ff5effdf taught both clients and servers of the git
protocol to send an "agent" capability that just advertises
their version for statistics and debugging purposes.
However, the protocol-capabilities.txt document indicates
that the client's advertisement is actually a response, and
should never include capabilities not mentioned in the
server's advertisement.

Adding the unconditional advertisement in the server
programs was OK, then, but the clients broke the protocol.
The server implementation of git-core itself does not care,
but at least one does: the Google Code git server will hang
up with an internal error upon seeing an unknown capability.

Instead, each client must record whether we saw an agent
string from the server, and respond with its agent only if
the server mentioned it first.

Signed-off-by: Jeff King <peff@peff.net>
---
 builtin/fetch-pack.c |  7 ++++++-
 builtin/send-pack.c  | 12 +++++++++---
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index fe56596..bc7a0f9 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -19,6 +19,7 @@ static int prefer_ofs_delta = 1;
 static int no_done;
 static int fetch_fsck_objects = -1;
 static int transfer_fsck_objects = -1;
+static int agent_supported;
 static struct fetch_pack_args args = {
 	/* .uploadpack = */ "git-upload-pack",
 };
@@ -328,7 +329,8 @@ static int find_common(int fd[2], unsigned char *result_sha1,
 			if (args.no_progress)   strbuf_addstr(&c, " no-progress");
 			if (args.include_tag)   strbuf_addstr(&c, " include-tag");
 			if (prefer_ofs_delta)   strbuf_addstr(&c, " ofs-delta");
-			strbuf_addf(&c, " agent=%s", git_user_agent_sanitized());
+			if (agent_supported)    strbuf_addf(&c, " agent=%s",
+							    git_user_agent_sanitized());
 			packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
 			strbuf_release(&c);
 		} else
@@ -821,6 +823,9 @@ static struct ref *do_fetch_pack(int fd[2],
 			fprintf(stderr, "Server supports ofs-delta\n");
 	} else
 		prefer_ofs_delta = 0;
+	if (server_supports("agent"))
+		agent_supported = 1;
+
 	if (everything_local(&ref, nr_match, match)) {
 		packet_flush(fd[1]);
 		goto all_done;
diff --git a/builtin/send-pack.c b/builtin/send-pack.c
index 5c69995..7d05064 100644
--- a/builtin/send-pack.c
+++ b/builtin/send-pack.c
@@ -252,6 +252,7 @@ int send_pack(struct send_pack_args *args,
 	int status_report = 0;
 	int use_sideband = 0;
 	int quiet_supported = 0;
+	int agent_supported = 0;
 	unsigned cmds_sent = 0;
 	int ret;
 	struct async demux;
@@ -267,6 +268,8 @@ int send_pack(struct send_pack_args *args,
 		use_sideband = 1;
 	if (server_supports("quiet"))
 		quiet_supported = 1;
+	if (server_supports("agent"))
+		agent_supported = 1;
 
 	if (!remote_refs) {
 		fprintf(stderr, "No refs in common and none specified; doing nothing.\n"
@@ -306,14 +309,17 @@ int send_pack(struct send_pack_args *args,
 			char *new_hex = sha1_to_hex(ref->new_sha1);
 			int quiet = quiet_supported && (args->quiet || !args->progress);
 
-			if (!cmds_sent && (status_report || use_sideband || quiet)) {
+			if (!cmds_sent && (status_report || use_sideband ||
+					   quiet || agent_supported)) {
 				packet_buf_write(&req_buf,
-						 "%s %s %s%c%s%s%s agent=%s",
+						 "%s %s %s%c%s%s%s%s%s",
 						 old_hex, new_hex, ref->name, 0,
 						 status_report ? " report-status" : "",
 						 use_sideband ? " side-band-64k" : "",
 						 quiet ? " quiet" : "",
-						 git_user_agent_sanitized());
+						 agent_supported ? " agent=" : "",
+						 agent_supported ? git_user_agent_sanitized() : ""
+						);
 			}
 			else
 				packet_buf_write(&req_buf, "%s %s %s",
-- 
1.7.12.rc2.4.g7f05cf9

  parent reply	other threads:[~2012-08-10  7:57 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-10  7:53 [PATCH 0/4] jk/version-string and google code Jeff King
2012-08-10  7:57 ` [PATCH 1/4] send-pack: fix capability-sending logic Jeff King
2012-08-10  7:57 ` Jeff King [this message]
2012-08-10 19:45   ` [PATCH 2/4] do not send client agent unless server does first Junio C Hamano
2012-08-10 21:09     ` Jeff King
2012-08-10  7:58 ` [PATCH 3/4] connect: learn to parse capabilities with values Jeff King
2012-08-10  8:06   ` Eric Sunshine
2012-08-10 20:01   ` Junio C Hamano
2012-08-10 21:15     ` Jeff King
2012-08-10 21:55       ` Junio C Hamano
2012-08-13 19:03         ` Junio C Hamano
2012-08-13 19:07           ` [PATCH 4/4] fetch-pack: mention server version with verbose output Junio C Hamano
2012-08-13 19:43             ` Junio C Hamano
2012-08-13 20:54             ` Jeff King
2012-08-13 21:07               ` Junio C Hamano
2012-08-13 21:07                 ` Jeff King
2012-08-13 21:09               ` Junio C Hamano
2012-08-13 21:11                 ` Jeff King
2012-08-14  1:59                   ` Jeff King
2012-08-14  2:02                     ` Jeff King
2012-08-14  4:56                       ` Junio C Hamano
2012-08-10  7:59 ` Jeff King
2012-08-10 15:34 ` [PATCH 0/4] jk/version-string and google code Junio C Hamano
2012-08-10 17:46   ` Jeff King
2012-08-10 18:52     ` Junio C Hamano
2012-08-10 21:50       ` Jeff King
2012-08-10 22:29         ` Shawn Pearce
2012-08-10 22:36           ` Junio C Hamano
2012-08-10 15:37 ` Junio C Hamano
2012-08-10 18:06   ` Dave Borowitz
2012-08-10 18:08     ` Jeff King
2012-08-10 18:13       ` Dave Borowitz
2012-08-10 18:25         ` Jeff King
2012-08-10 21:25           ` Junio C Hamano
2012-08-10 21:35             ` Jeff King
2012-08-10 21:42               ` Junio C Hamano
2012-08-10 19:11         ` Junio C Hamano

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=20120810075743.GB8399@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=spearce@spearce.org \
    /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.