git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 3/4] connect: learn to parse capabilities with values

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 13, 2012, 19:03 UTC
Message-ID
<7vboieehrf.fsf@alter.siamese.dyndns.org>
In-Reply-To
<7v393uif9g.fsf@alter.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
Show 16 quoted lines
> I forgot to mention it, but the above was done also to make it
> "possible but not mandatory" to pay extra allocation penalty.  The
> caller can choose to parse the string into an int, for example,
> without extra allocation.  Only the ones that want a string value
> and keep a copy around do have to do xmemdupz().
>
>> Anyway, do you think this is even worth doing at this point? I'm
>> lukewarm on the final two patches due to the existence of
>> GIT_TRACE_PACKET, which is much more likely to be useful.
>
> In the longer term, I think giving callers access to the parameter
> value given to a capability is necessary.  If we had this facility
> in the old days, we wouldn't have done side-band-64k but spelled it
> as side-band=64k.
>
> For the agent=<foo>, certainly we don't need it.

Here are the first of two patches to replace your 3 and 4 without extra allocations, primarily for further discussion.

-- >8 --
Subject: [PATCH 3/4] connect: expose the parameter to a capability

We already take care to parse a capability like "foo=bar" properly, but the code does not provide a good way of actually finding out what is on the right-hand side of the "=".

Based on the patch by Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 cache.h   |  1 +
 connect.c | 27 ++++++++++++++++++++-------
 2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/cache.h b/cache.h
index 06413e1..d239cee 100644
--- a/cache.h
+++ b/cache.h
@@ -1030,6 +1030,7 @@ struct extra_have_objects {
 };
 extern struct ref **get_remote_heads(int in, struct ref **list, unsigned int flags, struct extra_have_objects *);
 extern int server_supports(const char *feature);
+extern const char *server_feature(const char *feature, int *len_ret);
 extern const char *parse_feature_request(const char *features, const char *feature);
 
 extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);
diff --git a/connect.c b/connect.c
index 912cdde..42640bc 100644
--- a/connect.c
+++ b/connect.c
@@ -99,12 +99,7 @@ struct ref **get_remote_heads(int in, struct ref **list,
 	return list;
 }
 
-int server_supports(const char *feature)
-{
-	return !!parse_feature_request(server_capabilities, feature);
-}
-
-const char *parse_feature_request(const char *feature_list, const char *feature)
+static const char *parse_feature_request_1(const char *feature_list, const char *feature, int *lenp)
 {
 	int len;
 
@@ -117,13 +112,31 @@ const char *parse_feature_request(const char *feature_list, const char *feature)
 		if (!found)
 			return NULL;
 		if ((feature_list == found || isspace(found[-1])) &&
-		    (!found[len] || isspace(found[len]) || found[len] == '='))
+		    (!found[len] || isspace(found[len]) || found[len] == '=')) {
+			if (lenp)
+				*lenp = strcspn(found, " \t\n");
 			return found;
+		}
 		feature_list = found + 1;
 	}
 	return NULL;
 }
 
+const char *parse_feature_request(const char *feature_list, const char *feature)
+{
+	return parse_feature_request_1(feature_list, feature, NULL);
+}
+
+const char *server_feature(const char *feature, int *len)
+{
+	return parse_feature_request_1(server_capabilities, feature, len);
+}
+
+int server_supports(const char *feature)
+{
+	return !!server_feature(feature, NULL);
+}
+
 enum protocol {
 	PROTO_LOCAL = 1,
 	PROTO_SSH,
-- 
1.7.12.rc2.85.g1de7134
Previous: Junio C HamanoNext: Junio C Hamano
Message 11 of 37 in “jk/version-string and google code”
  1. 0/4 jk/version-string and google codeJeff King, Aug 10, 2012
  2. 1/4 send-pack: fix capability-sending logicJeff King, Aug 10, 2012
  3. 2/4 do not send client agent unless server does firstJeff King, Aug 10, 2012
  4. Junio C HamanoAug 10, 2012
  5. Jeff KingAug 10, 2012
  6. 3/4 connect: learn to parse capabilities with valuesJeff King, Aug 10, 2012
  7. Eric SunshineAug 10, 2012
  8. Junio C HamanoAug 10, 2012
  9. Jeff KingAug 10, 2012
  10. Junio C HamanoAug 10, 2012
  11. Junio C HamanoAug 13, 2012
  12. 4/4 fetch-pack: mention server version with verbose outputJunio C Hamano, Aug 13, 2012
  13. Junio C HamanoAug 13, 2012
  14. Jeff KingAug 13, 2012
  15. Junio C HamanoAug 13, 2012
  16. Jeff KingAug 13, 2012
  17. Junio C HamanoAug 13, 2012
  18. Jeff KingAug 13, 2012
  19. Jeff KingAug 14, 2012
  20. Jeff KingAug 14, 2012
  21. Junio C HamanoAug 14, 2012
  22. 4/4 fetch-pack: mention server version with verbose outputJeff King, Aug 10, 2012
  23. Junio C HamanoAug 10, 2012
  24. Jeff KingAug 10, 2012
  25. Junio C HamanoAug 10, 2012
  26. Jeff KingAug 10, 2012
  27. Shawn PearceAug 10, 2012
  28. Junio C HamanoAug 10, 2012
  29. Junio C HamanoAug 10, 2012
  30. Dave BorowitzAug 10, 2012
  31. Jeff KingAug 10, 2012
  32. Dave BorowitzAug 10, 2012
  33. Jeff KingAug 10, 2012
  34. Junio C HamanoAug 10, 2012
  35. Jeff KingAug 10, 2012
  36. Junio C HamanoAug 10, 2012
  37. Junio C HamanoAug 10, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.