[PATCH GSoC v2 0/6] cat-file: extend remote-object-info to support %(objecttype)
- From
Pablo Sabater <pabloosabaterr@gmail.com>
- Date
- Jul 31, 2026, 19:49 UTC
- Message-ID
- <20260731-objecttype-support-v2-0-af577461ed57@gmail.com>
- In-Reply-To
- <20260725-objecttype-support-v1-0-2d4ca3bbabf1@gmail.com>
"%(objecttype)" is already known by the client's allow-list, but neither the client nor the server knows how to handle type. This series continues the work for git cat-file --batch-command extending remote-object-info to support "%(objecttype)" end to end. It is based on its predecessor series "cat-file: add remote-object-info to batch-command" [1].
Type is the last property that is identical on the server and on the client once fetched.
Whether to support more metadata such as:
- objectsize:disk - deltabase - objectmode (needs context)
should be discussed, unlike size and type, the rest depend on how things are packed on the server and on what the client already has, so they cannot reliably match local once fetched. IMO they are not worth supporting, I can't find a use case for them.
Adding new placeholders has become trivial. To add a new placeholder, follow the steps in this series and add it to the client's allow-list at 'builtin/cat-file.c'.
Based-on: <20260724-ps-eric-work-rebase-v21-0-ba67f024fdff@gmail.com>
Github CI: https://github.com/pabloosabaterr/git/actions/runs/30660227202
[1]: https://lore.kernel.org/git/20260724-ps-eric-work-rebase-v21-0-ba67f024fdff@gmail.com/
Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com> --- Changes in v2: - Changed t5701 test to use test_file_size. - Changed the for loop to use for_each_string_list_item(). - Moved "fetch-object-info: request all supported options dynamically" patch to be the first one as it is prep patch. - Typos and nits. - Restored the test mixing info and remote-object-info, adapted to the unified format. - Link to v1: https://lore.kernel.org/git/20260725-objecttype-support-v1-0-2d4ca3bbabf1@gmail.com/
---
Pablo Sabater (6):
fetch-object-info: request all supported options dynamically
t5701: use the test_file_size() helper
protocol-caps: add type support to object-info
fetch-object-info: parse type from server response
serve: advertise type capability
cat-file: unify default formatDocumentation/git-cat-file.adoc | 17 +++----- Documentation/gitprotocol-v2.adoc | 15 +++++-- builtin/cat-file.c | 7 --- fetch-object-info.c | 23 +++++++--- protocol-caps.c | 21 +++++++-- serve.c | 4 +- t/t1017-cat-file-remote-object-info.sh | 78 +++++++++++++++++++++------------- t/t5701-git-serve.sh | 31 +++++++++++++- 8 files changed, 133 insertions(+), 63 deletions(-)
Range-diff versus v1:
-: ---------- > 1: f635361786 fetch-object-info: request all supported options dynamically
-: ---------- > 2: 5195b2db2e t5701: use the test_file_size() helper
1: acdff1bbd3 ! 3: 08a4a86ac9 protocol-caps: add type support to object-info
@@ Commit message
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.
+ 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>
@@ protocol-caps.c: static void send_info(struct repository *r, struct packet_write
+
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;
-+ enum object_type object_type;
if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) {
packet_writer_error(
@@ t/t5701-git-serve.sh: test_expect_success 'basics of object-info' '
test_cmp expect actual
'
-+test_expect_success 'type' '
++test_expect_success 'object-info supports type' '
+ test_config transfer.advertiseObjectInfo true &&
+
+ test-tool pkt-line pack >in <<-EOF &&
@@ t/t5701-git-serve.sh: test_expect_success 'basics of object-info' '
+ 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
++ $(git rev-parse two:two.t) $(test_file_size two.t) blob
++ $(git rev-parse two:two.t) $(test_file_size two.t) blob
+ 0000
+ EOF
+
2: c1a8a83acf = 4: 4d8e2ddb5d fetch-object-info: parse type from server response
3: ed0215c3e5 < -: ---------- fetch-object-info: request all supported options dynamically
4: 27efd907bd ! 5: 973b490b75 serve: advertise type capability
@@ t/t1017-cat-file-remote-object-info.sh: test_expect_success 'remote-object-info
git cat-file --batch-command="%(objecttype)" >actual <<-EOF &&
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
EOF
+@@ t/t1017-cat-file-remote-object-info.sh: test_expect_success 'unsupported placeholder on remote returns empty string' '
+ )
+ '
+
++test_expect_success 'unsupported placeholders on remote return empty string' '
++ (
++ set_transport_variables "$daemon_parent" &&
++ cd "$daemon_parent/daemon_client_empty" &&
++
++ fmt="%(objectmode) %(objectsize:disk) %(rest) %(deltabase)" &&
++
++ # The hardcoded SPs between the atoms are respected.
++ echo " " >expect &&
++ git cat-file --batch-command="$fmt" >actual <<-EOF &&
++ remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
++ EOF
++ test_cmp expect actual
++ )
++'
++
+ test_expect_success 'requesting only objectname echoes back' '
+ (
+ set_transport_variables "$daemon_parent" &&
5: ab5a44d40e ! 6: 1668033b31 cat-file: unify default format
@@ Commit message
cat-file: unify default format
%(objecttype) is supported both by the client and by the server.
- Change the temporary default format to the unified version that other
- commands use.
+ Change the temporary default format to the unified version that the
+ other commands use.
Update documentation to remove %(objecttype) from the caveats of
- remote-object-info.
+ remote-object-info and show %(objecttype) support.
- Update tests that used the default format to expect type.
- Update documentation to show %(objecttype) support.
+ Now that type is supported and the default format unified, update the
+ tests to expect the new default format.
Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Mentored-by: Chandra Pratap <chandrapratap3519@gmail.com>
@@ Documentation/gitprotocol-v2.adoc: object-info
-information without having to fully fetch objects. Object size is the only
-information that is currently supported.
+information without having to fully fetch objects. Object size and type are the
-+only information that is currently supported.
++only information currently supported.
An `object-info` request takes the following arguments:
@@ t/t1017-cat-file-remote-object-info.sh: test_expect_success 'batch-command remot
'
-test_expect_success 'remote-object-info does not change the default format of info' '
-- (
-- set_transport_variables "$daemon_parent" &&
-- cd "$daemon_parent/daemon_client_empty" &&
--
-- local_content="local object" &&
-- local_oid=$(echo_without_newline "$local_content" | git hash-object -w --stdin) &&
-- local_size=$(strlen "$local_content") &&
--
-- echo "$local_oid blob $local_size" >expect &&
-- echo "$hello_oid $hello_size" >>expect &&
-- echo "$local_oid blob $local_size" >>expect &&
--
-- git cat-file --batch-command >actual <<-EOF &&
-- info $local_oid
-- remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
-- info $local_oid
-- EOF
-- test_cmp expect actual
-- )
--'
--
- test_expect_success 'batch-command --buffer remote-object-info git://' '
++test_expect_success 'remote-object-info and info can be mixed using the unified default format' '
(
set_transport_variables "$daemon_parent" &&
+ cd "$daemon_parent/daemon_client_empty" &&
+@@ t/t1017-cat-file-remote-object-info.sh: test_expect_success 'remote-object-info does not change the default format of in
+ local_size=$(strlen "$local_content") &&
+
+ echo "$local_oid blob $local_size" >expect &&
+- echo "$hello_oid $hello_size" >>expect &&
++ echo "$hello_oid blob $hello_size" >>expect &&
+ echo "$local_oid blob $local_size" >>expect &&
+
+ git cat-file --batch-command >actual <<-EOF &&
@@ t/t1017-cat-file-remote-object-info.sh: test_expect_success 'batch-command -Z remote-object-info git:// default filter'
set_transport_variables "$daemon_parent" &&
cd "$daemon_parent/daemon_client_empty" &&--- base-commit: 71e19e8d2713f385c3fcef59cf6f29bcbd93d91f change-id: 20260724-objecttype-support-ea1ef6941d07