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>
This commit is contained in:
Pablo Sabater
2026-08-04 20:43:00 +02:00
committed by Junio C Hamano
parent 1157343e48
commit b6562f2927
2 changed files with 48 additions and 3 deletions

View 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;

View File

@@ -369,6 +369,36 @@ test_expect_success 'basics of object-info' '
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_config transfer.advertiseObjectInfo true &&