git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH GSoC v2 4/6] fetch-object-info: parse type from server response

From
Jeff King <peff@peff.net>
Date
Aug 2, 2026, 15:43 UTC
Message-ID
<20260802154309.GA17844@coredump.intra.peff.net>
In-Reply-To
<DKEGM4BYZ4UW.UVJ1H8IGVF0Q@gmail.com>
On Sun, Aug 02, 2026 at 02:33:49PM +0200, Pablo Sabater wrote:
> I have the doubt of whether this change is desired for this series as
> prep or if I should keep on and later make a cleanup series as this
> doesn't make a change for a user.

IMHO it is worth doing now. I've spent a bit of time looking through this code and I found it kind of confusing. In particular:

  - there are a lot of semi-opaque structs, like object_info_args. It
    would seem simpler to me to pass those elements around independently
    to the functions that need them. Likewise, we seem to stuff a lot of
    data into the transport struct rather than passing it to the
    relevant functions, even though many of those elements are really
    just used for one function call, and aren't a property of the
    transport at all.
  - it's hard to see who is ultimately responsible for deciding whether
    a field is requested. I _think_ it comes down to sticking those
    strings into the object_info_options struct (which I might have
    called "attrs" or "atoms" or something; they are syntactically
    "options" in the v2 protocol, but I think from the perspective of
    this code that is not what they are).
    One thing you could do is have the caller pass in pointers for
    "types" and "sizes", and use their NULLness as an indication of what
    they want.  That would be more like how object_info works, and then
    it really becomes a low-level protocol details to form those into
    the v2 protocol option strings.
    But unlike local object_info, we sometimes find that the remote is
    not willing or able to provide a particular type. So we have to
    return a flag somehow for "I was / was not able to get types". You
    could do that with a bool in the response struct.
    Or you could flip it on its head. Have the caller provide a bool
    saying "I want types", and then the low-level code is responsible
    for allocating the "types" array, and leaves it NULL if types were
    not available. That means the caller has to clean up the result, but
    they'd have had to clean up their local arrays anyway.
    I _think_ that's what you're getting at with your example below.
  - the protocol makes this unnecessarily complex. In particular, if we
    ask for "type size", the server is free to return them in an
    arbitrary order, or even to omit one of them (even if it told us it
    supported it!). So we have to map their returned ordering onto our
    arrays. Gross. I guess we are stuck with it, though, as the server
    side has been around for a while. And it does indeed choose its own
    ordering independent of what the client sent.
    I also find the framing needlessly restrictive. Rather than one
    pkt-line per item, we get packets with space-separated values. What
    happens when a future item value has spaces in it?
    As a side note, I think this is a good reason not to ship half of a
    protocol implementation. Without seeing both sides, you don't know
    what gotchas are lurking. But once one side ships, then it's hard to
    change the protocol later. This critique may all just me being
    cranky, though. ;)
Show 16 quoted lines
> What I understood is that fetch_object_info shouldn't use object_info to
> store the results, because it doesn't call read_object_info() like other
> commands like 'info' do. Then, it should use its own data structure to
> hold the results with flags like wants_size and wants_type. Something
> like:
> 
> 	struct object_info_results {
> 		enum object_type *types;
> 		size_t *sizes;
> 		unsigned *unrecognized;
> 		size_t nr;
> 		unsigned wants_size:1;
> 		unsigned wants_type:1;
> 	};
> 
> All three of the pointers are nr long.

Yeah. At first I thought your wants_size is redundant, but I guess if the goal is for the low-level code to allocate the "sizes" array, then we cannot use it as a signal (i.e., this is the "flip it on its head" direction I gave above).

I do think you want to be careful with how wants_size interacts with the "object_info_options" string list. IMHO it would make things easier if that string-ification happened deep down, probably in send_object_info_request(). And then the rest of the code can consistently use wants_size to see if we want sizes (and checking "sizes" for NULL to cover the case that the server did not support it).

> This could be done in two patches, as I was going to do a prep to
> prepare the current code (size only) and this patch would add type for
> fetch_object_info().
Yeah, that would make sense.
Show 7 quoted lines
> > It could be something we may want to
> > clean-up much later after all the dust settles from this year's
> > GSoC.  I dunno.
> 
> So I'm a bit lost about what to do, I'm happy to make that in this
> series or as a cleanup series later after GSoC which ends in a couple
> weeks.

I think the "after the dust settles" suggestion was for changing the interface of "struct object_info". That all becomes moot if we stop using it here entirely. So I think you should proceed along the lines of the object_info_results you showed above.

-Peff
Previous: Pablo SabaterNext: Junio C Hamano
Message 40 of 112 in “cat-file: extend remote-object-info to support %(objecttype)”
  1. 0/5 cat-file: extend remote-object-info to support %(objecttype)Pablo Sabater, Jul 25, 2026
  2. 1/5 protocol-caps: add type support to object-infoPablo Sabater, Jul 25, 2026
  3. Chandra PratapJul 29, 2026
  4. Pablo SabaterJul 29, 2026
  5. Junio C HamanoJul 29, 2026
  6. Karthik NayakJul 29, 2026
  7. 2/5 fetch-object-info: parse type from server responsePablo Sabater, Jul 25, 2026
  8. Chandra PratapJul 29, 2026
  9. Pablo SabaterJul 29, 2026
  10. Chandra PratapJul 29, 2026
  11. Karthik NayakJul 29, 2026
  12. Karthik NayakJul 29, 2026
  13. 3/5 fetch-object-info: request all supported options dynamicallyPablo Sabater, Jul 25, 2026
  14. Chandra PratapJul 29, 2026
  15. Pablo SabaterJul 29, 2026
  16. 4/5 serve: advertise type capabilityPablo Sabater, Jul 25, 2026
  17. Chandra PratapJul 29, 2026
  18. Pablo SabaterJul 29, 2026
  19. 5/5 cat-file: unify default formatPablo Sabater, Jul 25, 2026
  20. Chandra PratapJul 29, 2026
  21. Pablo SabaterJul 29, 2026
  22. Chandra PratapJul 29, 2026
  23. Pablo SabaterJul 29, 2026
  24. 0/6 cat-file: extend remote-object-info to support %(objecttype)Pablo Sabater, Jul 31, 2026
  25. 1/6 fetch-object-info: request all supported options dynamicallyPablo Sabater, Jul 31, 2026
  26. Junio C HamanoJul 31, 2026
  27. 2/6 t5701: use the test_file_size() helperPablo Sabater, Jul 31, 2026
  28. Junio C HamanoAug 1, 2026
  29. Pablo SabaterAug 1, 2026
  30. 3/6 protocol-caps: add type support to object-infoPablo Sabater, Jul 31, 2026
  31. Junio C HamanoAug 1, 2026
  32. 4/6 fetch-object-info: parse type from server responsePablo Sabater, Jul 31, 2026
  33. Junio C HamanoAug 1, 2026
  34. Junio C HamanoAug 1, 2026
  35. Pablo SabaterAug 1, 2026
  36. Jeff KingAug 1, 2026
  37. Jeff KingAug 1, 2026
  38. Junio C HamanoAug 2, 2026
  39. Pablo SabaterAug 2, 2026
  40. Jeff KingAug 2, 2026
  41. Junio C HamanoAug 2, 2026
  42. Junio C HamanoAug 2, 2026
  43. Jeff KingAug 2, 2026
  44. Junio C HamanoAug 2, 2026
  45. Pablo SabaterAug 1, 2026
  46. 5/6 serve: advertise type capabilityPablo Sabater, Jul 31, 2026
  47. Chandra PratapAug 1, 2026
  48. Pablo SabaterAug 1, 2026
  49. 6/6 cat-file: unify default formatPablo Sabater, Jul 31, 2026
  50. 0/8 cat-file: extend remote-object-info to support %(objecttype)Pablo Sabater, Aug 3, 2026
  51. 1/8 t5701: use test_file_size() to get the size of a filePablo Sabater, Aug 3, 2026
  52. Junio C HamanoAug 3, 2026
  53. Pablo SabaterAug 3, 2026
  54. 2/8 fetch-object-info: detect truncated server responsesPablo Sabater, Aug 3, 2026
  55. Junio C HamanoAug 3, 2026
  56. Pablo SabaterAug 3, 2026
  57. 3/8 fetch-object-info: pass arguments directly instead of a structPablo Sabater, Aug 3, 2026
  58. Junio C HamanoAug 3, 2026
  59. Karthik NayakAug 4, 2026
  60. Pablo SabaterAug 4, 2026
  61. 4/8 fetch-object-info: use dedicated struct for the resultsPablo Sabater, Aug 3, 2026
  62. Junio C HamanoAug 3, 2026
  63. Pablo SabaterAug 3, 2026
  64. 5/8 protocol-caps: add type support to object-infoPablo Sabater, Aug 3, 2026
  65. 6/8 fetch-object-info: parse type from server responsePablo Sabater, Aug 3, 2026
  66. 7/8 serve: advertise type capabilityPablo Sabater, Aug 3, 2026
  67. 8/8 cat-file: unify default formatPablo Sabater, Aug 3, 2026
  68. 0/9 cat-file: extend remote-object-info to support %(objecttype)Pablo Sabater, Aug 4, 2026
  69. 1/9 t5701: use test_file_size() to get the size of a filePablo Sabater, Aug 4, 2026
  70. 2/9 fetch-object-info: detect malformed server responsesPablo Sabater, Aug 4, 2026
  71. Junio C HamanoAug 4, 2026
  72. 3/9 fetch-object-info: pass arguments directly instead of a structPablo Sabater, Aug 4, 2026
  73. Junio C HamanoAug 4, 2026
  74. Karthik NayakAug 6, 2026
  75. 5/9 fetch-object-info: die() on the remaining error pathPablo Sabater, Aug 4, 2026
  76. 4/9 fetch-object-info: use dedicated struct for the resultsPablo Sabater, Aug 4, 2026
  77. Junio C HamanoAug 4, 2026
  78. Pablo SabaterAug 4, 2026
  79. 6/9 protocol-caps: add type support to object-infoPablo Sabater, Aug 4, 2026
  80. 7/9 fetch-object-info: parse type from server responsePablo Sabater, Aug 4, 2026
  81. 8/9 serve: advertise type capabilityPablo Sabater, Aug 4, 2026
  82. 9/9 cat-file: unify default formatPablo Sabater, Aug 4, 2026
  83. Jeff KingAug 6, 2026
  84. Pablo SabaterAug 7, 2026
  85. Jeff KingAug 7, 2026
  86. 00/10 cat-file: extend remote-object-info to support %(objecttype)Pablo Sabater, Aug 7, 2026
  87. 01/10 t5701: use test_file_size() to get the size of a filePablo Sabater, Aug 7, 2026
  88. 02/10 fetch-object-info: detect malformed server responsesPablo Sabater, Aug 7, 2026
  89. 03/10 fetch-object-info: pass arguments directly instead of a structPablo Sabater, Aug 7, 2026
  90. 04/10 fetch-object-info: use dedicated struct for the resultsPablo Sabater, Aug 7, 2026
  91. 05/10 fetch-object-info: die() on the remaining error pathPablo Sabater, Aug 7, 2026
  92. 06/10 transport: drop remote object-info fields from transport structPablo Sabater, Aug 7, 2026
  93. 07/10 protocol-caps: add type support to object-infoPablo Sabater, Aug 7, 2026
  94. 08/10 fetch-object-info: parse type from server responsePablo Sabater, Aug 7, 2026
  95. 09/10 serve: advertise type capabilityPablo Sabater, Aug 7, 2026
  96. 10/10 cat-file: unify default formatPablo Sabater, Aug 7, 2026
  97. Pablo SabaterAug 7, 2026
  98. 00/10 cat-file: extend remote-object-info to support %(objecttype)Pablo Sabater, Aug 8, 2026
  99. 01/10 t5701: use test_file_size() to get the size of a filePablo Sabater, Aug 8, 2026
  100. 02/10 fetch-object-info: detect malformed server responsesPablo Sabater, Aug 8, 2026
  101. 03/10 fetch-object-info: pass arguments directly instead of a structPablo Sabater, Aug 8, 2026
  102. 04/10 fetch-object-info: use dedicated struct for the resultsPablo Sabater, Aug 8, 2026
  103. 05/10 fetch-object-info: die() on the remaining error pathPablo Sabater, Aug 8, 2026
  104. 06/10 transport: drop remote object-info fields from transport structPablo Sabater, Aug 8, 2026
  105. Junio C HamanoAug 8, 2026
  106. Chandra PratapAug 8, 2026
  107. Karthik NayakAug 11, 2026
  108. 07/10 protocol-caps: add type support to object-infoPablo Sabater, Aug 8, 2026
  109. 08/10 fetch-object-info: parse type from server responsePablo Sabater, Aug 8, 2026
  110. 09/10 serve: advertise type capabilityPablo Sabater, Aug 8, 2026
  111. 10/10 cat-file: unify default formatPablo Sabater, Aug 8, 2026
  112. Jeff KingAug 8, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.