Re: [PATCH GSoC 1/5] protocol-caps: add type support to object-info
Chandra Pratap <[email protected]> Wed, 29 Jul 2026 15:23:23 +0530
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <CA+J6zkQFAqZvi-6UaQi6v_OBiT4ihZtCN45vyGCGTbo9TJLJbg@mail.gmail.com> |
On Sat, 25 Jul 2026 at 17:25, Pablo Sabater <[email protected]> wrote: > > 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 at it, fix requested_info->size bit field style. > > Mentored-by: Karthik Nayak <[email protected]> > Mentored-by: Chandra Pratap <[email protected]> > Signed-off-by: Pablo Sabater <[email protected]> > --- > protocol-caps.c | 21 ++++++++++++++++++--- > t/t5701-git-serve.sh | 27 +++++++++++++++++++++++++++ > 2 files changed, 45 insertions(+), 3 deletions(-) > > diff --git a/protocol-caps.c b/protocol-caps.c > index 02261be14d..5531d388f0 100644 > --- a/protocol-caps.c > +++ b/protocol-caps.c > @@ -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; > struct object_id oid; > size_t object_size; > + enum object_type object_type; > > 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'", I assume this is a style change? The original line doesn't seem long enough to wrap though. Also, this would break the grep-ability of this error string. > 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; > > diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh > index 9a575aa098..d7c93b5b55 100755 > --- a/t/t5701-git-serve.sh > +++ b/t/t5701-git-serve.sh > @@ -366,6 +366,33 @@ test_expect_success 'basics of object-info' ' > test_cmp expect actual > ' > > +test_expect_success '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) $(wc -c <two.t | xargs) blob > + $(git rev-parse two:two.t) $(wc -c <two.t | xargs) blob Can we not use the `test_file_size` tool to do this instead? That should also be much more portable.