Re: [PATCH GSoC 2/5] fetch-object-info: parse type from server response

Karthik Nayak <[email protected]> Wed, 29 Jul 2026 17:47:17 -0500
Newsgroups org.kernel.vger.git
Message-ID <CAOLa=ZQbf2vdYOkFBHQ2Kkk=Yc0uSZXEPy+FQPyzp9C8=sUFEQ@mail.gmail.com>
Pablo Sabater <[email protected]> writes:

> The server can handle type requests but does not advertise the
> capability yet. Prepare the client to know how to parse the server
> response once the server advertises the capability.
>

Nit, I was a bit confused by the flow from the first to the second
sentence. Maybe:

    The server can handle type requests but does not advertise the
    capability yet. As a percursor, prepare the client to know how to
    parse the server response.

> Mentored-by: Karthik Nayak <[email protected]>
> Mentored-by: Chandra Pratap <[email protected]>
> Signed-off-by: Pablo Sabater <[email protected]>
> ---
>  fetch-object-info.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/fetch-object-info.c b/fetch-object-info.c
> index ba7e179c44..cf6b94afb8 100644
> --- a/fetch-object-info.c
> +++ b/fetch-object-info.c
> @@ -50,6 +50,7 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
>  		      const int stateless_rpc, const int fd_out)
>  {
>  	int size_index = -1;
> +	int type_index = -1;
>
>  	switch (version) {
>  	case protocol_v2:
> @@ -101,8 +102,13 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
>  			for (size_t j = 0; j < args->oids->nr; j++)
>  				object_info_data[j].sizep =
>  					xcalloc(1, sizeof(*object_info_data[j].sizep));
> +		} else if (!strcmp(reader->line, "type")) {
> +			type_index = (int)i;
> +			for (size_t j = 0; j < args->oids->nr; j++)
> +				object_info_data[j].typep =
> +					xcalloc(1, sizeof(*object_info_data[j].typep));
>  		} else {
> -			BUG("only size is supported");
> +			BUG("unexpected object-info option: %s", reader->line);
>  		}
>  	}
>
> @@ -148,6 +154,10 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
>  			    object_info_values.items[0].string,
>  			    object_info_values.items[size_index + 1].string);
>
> +		if (type_index >= 0)
> +			*object_info_data[i].typep =
> +				type_from_string(object_info_values.items[type_index + 1].string);
> +

For size, passing the value as a number makes sense, since the value
represents the field directly.

For type however, we're passing in a value, while the actual field is a
string. We rely on `type_from_string()` to make that translation for us,
which internatlly depends on `object_type_strings[]`. What if there is a
mismatch between the server and the client? Shouldn't we be sending in
the string itself?

>  		string_list_clear(&object_info_values, 0);
>  	}
>  	check_stateless_delimiter(stateless_rpc, reader, "stateless delimiter expected");
>
> --
> 2.54.0
signature.asc (application/pgp-signature, 690 B)
-----BEGIN PGP SIGNATURE-----

iQHKBAEBCgA0FiEEV85Mf2N1cQ/LZcYGPtWfJI5GjH8FAmpqgvIWHGthcnRoaWsu
MTg4QGdtYWlsLmNvbQAKCRA+1Z8kjkaMfxONC/9zyftwHqNiDf+96USfDzhYt7wI
P2Ul8r1E7yWrShySVCjvpPDormu9SUY2vBfkqBAF+3p5JTdJU1pO1y5wPYGAdlgo
S44pfcXlpJS+vsuJleP083v/EfsgM90CzKb5WPlC9sn+s1ATZyxBJeyYvxyoMZka
gHloNsj+yDfJc1Dky0J+wg1MEApG1pyiumCOqwlV+v1Xp8S4WIVkOP4iDuVKbkCP
Y3vBfbykgoQfLSDfjAWRPxmlUcVLmS28jI7nwgJruFcQKz/qzutwcYKRBNZE178y
qJKCDPpuwLwXNPYMPBHlqHtRgO/F/B5jn9rDDNTpJt7/Bus4Sm9tQzK2Sa7PsnQ0
o9k1kSUhOAbOOEN5E5FXwh8x65cwAgx9NGS6mUNn/jEOUPz4JAe3J/LHlhg3xFZZ
SqLTe3syDWnrPzRXgodShrG0VaNq+yqtb6Texhzviow9JtU709i45voCmXfV5+kO
gp0vVrdJVgxLQlPcJ0UbtMMa6UdiYkeya0ZnOt4=
=EkNM
-----END PGP SIGNATURE-----