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 "=". Signed-off-by: Jeff King <peff@xxxxxxxx> --- cache.h | 2 ++ connect.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/cache.h b/cache.h index 06413e1..3811c66 100644 --- a/cache.h +++ b/cache.h @@ -1030,7 +1030,9 @@ 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 char *server_feature_value(const char *feature); extern const char *parse_feature_request(const char *features, const char *feature); +extern char *parse_feature_request_value(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..6bd2531 100644 --- a/connect.c +++ b/connect.c @@ -104,6 +104,11 @@ int server_supports(const char *feature) return !!parse_feature_request(server_capabilities, feature); } +char *server_feature_value(const char *feature) +{ + return parse_feature_request_value(server_capabilities, feature); +} + const char *parse_feature_request(const char *feature_list, const char *feature) { int len; @@ -124,6 +129,33 @@ const char *parse_feature_request(const char *feature_list, const char *feature) return NULL; } +/* + * Parse features of the form "feature=value". Returns NULL if the feature + * does not exist, the empty string if it exists but does not have an "=", or + * the content to the right of the "=" until the first space (or end of + * string). The cannot contain literal spaces; double-quoting or similar + * schemes would break compatibility, since older versions of git treat the + * space as a hard-delimiter without any context. + * + * The return value (if non-NULL) is newly allocated on the heap and belongs to + * the caller. + */ +char *parse_feature_request_value(const char *feature_list, const char *feature) +{ + const char *start = parse_feature_request(feature_list, feature); + const char *end; + + if (!start || prefixcmp(start, feature)) + return NULL; + start += strlen(feature); + + if (*start == '=') + start++; + end = strchrnul(start, ' '); + + return xmemdupz(start, end - start); +} + enum protocol { PROTO_LOCAL = 1, PROTO_SSH, -- 1.7.12.rc2.4.g7f05cf9 -- 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