diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-09-11 11:06:45 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-09-11 11:06:45 -0700 |
commit | 59d7cbd343d098783f8a91fb67d90ac3d066ea77 (patch) | |
tree | f3655aec189b8c190b366c7616632cb7e83454b9 /connect.c | |
parent | 2af6d98a5e85ede052c46ab8d35f77e5ad4ae804 (diff) | |
parent | 36c60f7a08b28e2cee649d697291ac6b708b213f (diff) | |
download | git-59d7cbd343d098783f8a91fb67d90ac3d066ea77.tar.gz git-59d7cbd343d098783f8a91fb67d90ac3d066ea77.tar.xz |
Merge branch 'jc/capabilities' into maint
* jc/capabilities:
fetch-pack: mention server version with verbose output
parse_feature_request: make it easier to see feature values
fetch-pack: do not ask for unadvertised capabilities
do not send client agent unless server does first
send-pack: fix capability-sending logic
include agent identifier in capability string
Diffstat (limited to 'connect.c')
-rw-r--r-- | connect.c | 45 |
1 files changed, 36 insertions, 9 deletions
@@ -115,12 +115,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) +const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp) { int len; @@ -132,14 +127,46 @@ const char *parse_feature_request(const char *feature_list, const char *feature) const char *found = strstr(feature_list, feature); if (!found) return NULL; - if ((feature_list == found || isspace(found[-1])) && - (!found[len] || isspace(found[len]) || found[len] == '=')) - return found; + if (feature_list == found || isspace(found[-1])) { + const char *value = found + len; + /* feature with no value (e.g., "thin-pack") */ + if (!*value || isspace(*value)) { + if (lenp) + *lenp = 0; + return value; + } + /* feature with a value (e.g., "agent=git/1.2.3") */ + else if (*value == '=') { + value++; + if (lenp) + *lenp = strcspn(value, " \t\n"); + return value; + } + /* + * otherwise we matched a substring of another feature; + * keep looking + */ + } feature_list = found + 1; } return NULL; } +int parse_feature_request(const char *feature_list, const char *feature) +{ + return !!parse_feature_value(feature_list, feature, NULL); +} + +const char *server_feature_value(const char *feature, int *len) +{ + return parse_feature_value(server_capabilities, feature, len); +} + +int server_supports(const char *feature) +{ + return !!server_feature_value(feature, NULL); +} + enum protocol { PROTO_LOCAL = 1, PROTO_SSH, |