]> git.ipfire.org Git - thirdparty/git.git/commitdiff
protocol-caps: add type support to object-info
authorPablo Sabater <pabloosabaterr@gmail.com>
Fri, 31 Jul 2026 19:49:36 +0000 (21:49 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 31 Jul 2026 22:02:10 +0000 (15:02 -0700)
Teach the server-side object-info handler to accept type as a requested
field. When the client includes type in its object-info request, the
server returns the requested object type.

While touching send_info(), wrap an over-long line and fix the bit field
style of requested_info.size.

Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Mentored-by: Chandra Pratap <chandrapratap3519@gmail.com>
Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
protocol-caps.c
t/t5701-git-serve.sh

index 02261be14d817ae12f08d28ba15baa83f750426a..27e0f85b100cb9e6d4f47c495c1be2fcf520c933 100644 (file)
@@ -11,7 +11,8 @@
 #include "strbuf.h"
 
 struct requested_info {
-       unsigned size : 1;
+       unsigned size:1;
+       unsigned type:1;
 };
 
 /*
@@ -73,15 +74,20 @@ static void send_info(struct repository *r, struct packet_writer *writer,
        if (info->size)
                packet_writer_write(writer, "size");
 
+       if (info->type)
+               packet_writer_write(writer, "type");
+
        for_each_string_list_item (item, oid_str_list) {
                const char *oid_str = item->string;
+               enum object_type object_type;
                struct object_id oid;
                size_t object_size;
 
                if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) {
                        packet_writer_error(
                                writer,
-                               "object-info: protocol error, expected to get oid, not '%s'",
+                               "object-info: protocol error, expected to get "
+                               "oid, not '%s'",
                                oid_str);
                        continue;
                }
@@ -93,7 +99,8 @@ static void send_info(struct repository *r, struct packet_writer *writer,
                 * If an object is not recognized by the server append SP to
                 * the response.
                 */
-               if (get_object_info(r->objects, &oid, &object_size) <= OBJ_NONE) {
+               object_type = get_object_info(r->objects, &oid, &object_size);
+               if (object_type <= OBJ_NONE) {
                        strbuf_addstr(&send_buffer, " ");
                        goto write;
                }
@@ -103,6 +110,9 @@ static void send_info(struct repository *r, struct packet_writer *writer,
                                    (uintmax_t)object_size);
                }
 
+               if (info->type)
+                       strbuf_addf(&send_buffer, " %s", type_name(object_type));
+
 write:
                packet_writer_write(writer, "%s", send_buffer.buf);
                strbuf_reset(&send_buffer);
@@ -124,6 +134,11 @@ int cap_object_info(struct repository *r, struct packet_reader *request)
                        continue;
                }
 
+               if (!strcmp("type", request->line)) {
+                       info.type = 1;
+                       continue;
+               }
+
                if (parse_oid(request->line, &oid_str_list))
                        continue;
 
index b4d6beef11b7f7fb877b9d242e1d4bcf4b7bac95..d7445571b10f92fefc50fd0f709fcee5cb1dbf58 100755 (executable)
@@ -366,6 +366,33 @@ test_expect_success 'basics of object-info' '
        test_cmp expect actual
 '
 
+test_expect_success 'object-info supports type' '
+       test_config transfer.advertiseObjectInfo true &&
+
+       test-tool pkt-line pack >in <<-EOF &&
+       command=object-info
+       object-format=$(test_oid algo)
+       0001
+       size
+       type
+       oid $(git rev-parse two:two.t)
+       oid $(git rev-parse two:two.t)
+       0000
+       EOF
+
+       cat >expect <<-EOF &&
+       size
+       type
+       $(git rev-parse two:two.t) $(test_file_size two.t) blob
+       $(git rev-parse two:two.t) $(test_file_size two.t) blob
+       0000
+       EOF
+
+       test-tool serve-v2 --stateless-rpc <in >out &&
+       test-tool pkt-line unpack <out >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'bare OID request' '
        test_config transfer.advertiseObjectInfo true &&