]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bundle-uri: create "key=value" line parsing
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Wed, 12 Oct 2022 12:52:31 +0000 (12:52 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 12 Oct 2022 16:13:24 +0000 (09:13 -0700)
When advertising a bundle list over Git's protocol v2, we will use
packet lines. Each line will be of the form "key=value" representing a
bundle list. Connect the API necessary for Git's transport to the
key-value pair parsing created in the previous change.

We are not currently implementing this protocol v2 functionality, but
instead preparing to expose this parsing to be unit-testable.

Co-authored-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
bundle-uri.c
bundle-uri.h

index 0bc59dd9c3430338690ea1e90972ccf096199441..372e6fac5cfa4fa06fd4768733ea2172ecf66f7d 100644 (file)
@@ -71,7 +71,6 @@ int for_all_bundles_in_list(struct bundle_list *list,
  * Returns 0 if the key-value pair is understood. Returns -1 if the key
  * is not understood or the value is malformed.
  */
-MAYBE_UNUSED
 static int bundle_list_update(const char *key, const char *value,
                              struct bundle_list *list)
 {
@@ -306,3 +305,29 @@ cleanup:
        free(filename);
        return result;
 }
+
+/**
+ * General API for {transport,connect}.c etc.
+ */
+int bundle_uri_parse_line(struct bundle_list *list, const char *line)
+{
+       int result;
+       const char *equals;
+       struct strbuf key = STRBUF_INIT;
+
+       if (!strlen(line))
+               return error(_("bundle-uri: got an empty line"));
+
+       equals = strchr(line, '=');
+
+       if (!equals)
+               return error(_("bundle-uri: line is not of the form 'key=value'"));
+       if (line == equals || !*(equals + 1))
+               return error(_("bundle-uri: line has empty key or value"));
+
+       strbuf_add(&key, line, equals - line);
+       result = bundle_list_update(key.buf, equals + 1, list);
+       strbuf_release(&key);
+
+       return result;
+}
index ff7e3fd3fb26482f006393023d8f504f79ee13c0..90583461929d5210305b9ce2ee8bec686e167c27 100644 (file)
@@ -67,4 +67,16 @@ int for_all_bundles_in_list(struct bundle_list *list,
  */
 int fetch_bundle_uri(struct repository *r, const char *uri);
 
+/**
+ * General API for {transport,connect}.c etc.
+ */
+
+/**
+ * Parse a "key=value" packet line from the bundle-uri verb.
+ *
+ * Returns 0 on success and non-zero on error.
+ */
+int bundle_uri_parse_line(struct bundle_list *list,
+                         const char *line);
+
 #endif