[PATCH GSoC v2 0/6] cat-file: extend remote-object-info to support %(objecttype)
Pablo Sabater <[email protected]> Fri, 31 Jul 2026 21:49:33 +0200
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <[email protected]> |
"%(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: <[email protected]> Github CI: https://github.com/pabloosabaterr/git/actions/runs/30660227202 [1]: https://lore.kernel.org/git/[email protected]/ Signed-off-by: Pablo Sabater <[email protected]> --- 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/[email protected]/ --- 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 format Documentation/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 <[email protected]> Mentored-by: Chandra Pratap <[email protected]> @@ 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 <[email protected]> Mentored-by: Chandra Pratap <[email protected]> @@ 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