]> git.ipfire.org Git - thirdparty/git.git/commitdiff
serve: return capability "value" from get_capability()
authorJeff King <peff@peff.net>
Tue, 14 Sep 2021 15:30:50 +0000 (11:30 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Sep 2021 17:56:19 +0000 (10:56 -0700)
When the client sends v2 capabilities, they may be simple, like:

  foo

or have a value like:

  foo=bar

(all of the current capabilities actually expect a value, but the
protocol allows for boolean ones).

We use get_capability() to make sure the client's pktline matches a
capability. In doing so, we parse enough to see the "=" and the value
(if any), but we immediately forget it. Nobody cares for now, because they end
up parsing the values out later using has_capability(). But in
preparation for changing that, let's pass back a pointer so the callers
know what we found.

Note that unlike has_capability(), we'll return NULL for a "simple"
capability. Distinguishing these will be useful for some future patches.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
serve.c

diff --git a/serve.c b/serve.c
index fd88b95343365bdf132c11b33883f33eaf65fdb6..78a4e8355402149cd7d06f32e6055481546b15f6 100644 (file)
--- a/serve.c
+++ b/serve.c
@@ -139,7 +139,7 @@ void protocol_v2_advertise_capabilities(void)
        strbuf_release(&value);
 }
 
-static struct protocol_capability *get_capability(const char *key)
+static struct protocol_capability *get_capability(const char *key, const char **value)
 {
        int i;
 
@@ -149,8 +149,16 @@ static struct protocol_capability *get_capability(const char *key)
        for (i = 0; i < ARRAY_SIZE(capabilities); i++) {
                struct protocol_capability *c = &capabilities[i];
                const char *out;
-               if (skip_prefix(key, c->name, &out) && (!*out || *out == '='))
+               if (!skip_prefix(key, c->name, &out))
+                       continue;
+               if (!*out) {
+                       *value = NULL;
                        return c;
+               }
+               if (*out++ == '=') {
+                       *value = out;
+                       return c;
+               }
        }
 
        return NULL;
@@ -158,7 +166,8 @@ static struct protocol_capability *get_capability(const char *key)
 
 static int is_valid_capability(const char *key)
 {
-       const struct protocol_capability *c = get_capability(key);
+       const char *value;
+       const struct protocol_capability *c = get_capability(key, &value);
 
        return c && c->advertise(the_repository, NULL);
 }
@@ -168,7 +177,8 @@ static int parse_command(const char *key, struct protocol_capability **command)
        const char *out;
 
        if (skip_prefix(key, "command=", &out)) {
-               struct protocol_capability *cmd = get_capability(out);
+               const char *value;
+               struct protocol_capability *cmd = get_capability(out, &value);
 
                if (*command)
                        die("command '%s' requested after already requesting command '%s'",