protocol-caps: add type support to object-info

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>
main
Pablo Sabater 2026-08-08 02:02:22 +02:00 committed by Junio C Hamano
parent 567e62b1b9
commit 7692fa9019
2 changed files with 48 additions and 3 deletions

View File

@ -11,7 +11,8 @@
#include "strbuf.h" #include "strbuf.h"


struct requested_info { 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) if (info->size)
packet_writer_write(writer, "size"); packet_writer_write(writer, "size");


if (info->type)
packet_writer_write(writer, "type");

for_each_string_list_item (item, oid_str_list) { for_each_string_list_item (item, oid_str_list) {
const char *oid_str = item->string; const char *oid_str = item->string;
enum object_type object_type;
struct object_id oid; struct object_id oid;
size_t object_size; size_t object_size;


if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) { if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) {
packet_writer_error( packet_writer_error(
writer, writer,
"object-info: protocol error, expected to get oid, not '%s'", "object-info: protocol error, expected to get "
"oid, not '%s'",
oid_str); oid_str);
continue; 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 * If an object is not recognized by the server append SP to
* the response. * 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, " "); strbuf_addstr(&send_buffer, " ");
goto write; goto write;
} }
@ -103,6 +110,9 @@ static void send_info(struct repository *r, struct packet_writer *writer,
(uintmax_t)object_size); (uintmax_t)object_size);
} }


if (info->type)
strbuf_addf(&send_buffer, " %s", type_name(object_type));

write: write:
packet_writer_write(writer, "%s", send_buffer.buf); packet_writer_write(writer, "%s", send_buffer.buf);
strbuf_reset(&send_buffer); strbuf_reset(&send_buffer);
@ -124,6 +134,11 @@ int cap_object_info(struct repository *r, struct packet_reader *request)
continue; continue;
} }


if (!strcmp("type", request->line)) {
info.type = 1;
continue;
}

if (parse_oid(request->line, &oid_str_list)) if (parse_oid(request->line, &oid_str_list))
continue; continue;



View File

@ -369,6 +369,36 @@ test_expect_success 'basics of object-info' '
test_cmp expect actual test_cmp expect actual
' '


test_expect_success 'object-info supports type' '
test_config transfer.advertiseObjectInfo true &&

two_oid=$(git rev-parse two:two.t) &&
two_size=$(test_file_size two.t) &&

test-tool pkt-line pack >in <<-EOF &&
command=object-info
object-format=$(test_oid algo)
0001
size
type
oid $two_oid
oid $two_oid
0000
EOF

cat >expect <<-EOF &&
size
type
$two_oid $two_size blob
$two_oid $two_size 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_expect_success 'bare OID request' '
test_config transfer.advertiseObjectInfo true && test_config transfer.advertiseObjectInfo true &&