From: Pablo Sabater <pabloosabaterr@gmail.com>
To: git@vger.kernel.org
Cc: chandrapratap3519@gmail.com, karthik.188@gmail.com,
gitster@pobox.com, Pablo Sabater <pabloosabaterr@gmail.com>
Subject: [PATCH GSoC v2 0/6] cat-file: extend remote-object-info to support %(objecttype)
Date: Fri, 31 Jul 2026 21:49:33 +0200 [thread overview]
Message-ID: <20260731-objecttype-support-v2-0-af577461ed57@gmail.com> (raw)
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 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 <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
next prev parent reply other threads:[~2026-07-31 19:49 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-25 11:55 [PATCH GSoC 0/5] cat-file: extend remote-object-info to support %(objecttype) Pablo Sabater
2026-07-25 11:55 ` [PATCH GSoC 1/5] protocol-caps: add type support to object-info Pablo Sabater
2026-07-29 9:53 ` Chandra Pratap
2026-07-29 11:18 ` Pablo Sabater
2026-07-29 15:40 ` Junio C Hamano
2026-07-29 22:39 ` Karthik Nayak
2026-07-25 11:55 ` [PATCH GSoC 2/5] fetch-object-info: parse type from server response Pablo Sabater
2026-07-29 9:57 ` Chandra Pratap
2026-07-29 12:05 ` Pablo Sabater
2026-07-29 17:06 ` Chandra Pratap
2026-07-29 22:47 ` Karthik Nayak
2026-07-29 22:53 ` Karthik Nayak
2026-07-25 11:55 ` [PATCH GSoC 3/5] fetch-object-info: request all supported options dynamically Pablo Sabater
2026-07-29 9:57 ` Chandra Pratap
2026-07-29 12:07 ` Pablo Sabater
2026-07-25 11:55 ` [PATCH GSoC 4/5] serve: advertise type capability Pablo Sabater
2026-07-29 9:58 ` Chandra Pratap
2026-07-29 12:15 ` Pablo Sabater
2026-07-25 11:55 ` [PATCH GSoC 5/5] cat-file: unify default format Pablo Sabater
2026-07-29 9:59 ` Chandra Pratap
2026-07-29 12:23 ` Pablo Sabater
2026-07-29 9:52 ` [PATCH GSoC 0/5] cat-file: extend remote-object-info to support %(objecttype) Chandra Pratap
2026-07-29 12:34 ` Pablo Sabater
2026-07-31 19:49 ` Pablo Sabater [this message]
2026-07-31 19:49 ` [PATCH GSoC v2 1/6] fetch-object-info: request all supported options dynamically Pablo Sabater
2026-07-31 19:49 ` [PATCH GSoC v2 2/6] t5701: use the test_file_size() helper Pablo Sabater
2026-07-31 19:49 ` [PATCH GSoC v2 3/6] protocol-caps: add type support to object-info Pablo Sabater
2026-07-31 19:49 ` [PATCH GSoC v2 4/6] fetch-object-info: parse type from server response Pablo Sabater
2026-07-31 19:49 ` [PATCH GSoC v2 5/6] serve: advertise type capability Pablo Sabater
2026-07-31 19:49 ` [PATCH GSoC v2 6/6] cat-file: unify default format Pablo Sabater
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260731-objecttype-support-v2-0-af577461ed57@gmail.com \
--to=pabloosabaterr@gmail.com \
--cc=chandrapratap3519@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=karthik.188@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox