From 191740edaa4a17813b8e1595e3ef15068f88c8ba Mon Sep 17 00:00:00 2001 From: Royce Remer Date: Wed, 16 Sep 2026 13:32:21 -0700 Subject: [PATCH] upload-pack: swap wanted-ref/shallow-info responses When a server enables uploadpack.allowRefInWant, upload_pack_v2() sends wanted-ref info before shallow-info. The fetch-pack client expects shallow-info first; receiving them out of order causes it to exit: fatal: expected 'packfile', received 'shallow-info' This error condition only applies to protocol v2 clients performs a shallow fetch (--depth) against servers with allowRefInWant configured. Swap the send order so that upload_pack_v2() sends shallow-info before wanted-ref info. This is a server-side-only change and is compatible with all existing client versions. Signed-off-by: Royce Remer Signed-off-by: Junio C Hamano --- t/t5703-upload-pack-ref-in-want.sh | 18 ++++++++++++++++++ upload-pack.c | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index 249137b467..9e2a090c9e 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -295,6 +295,24 @@ test_expect_success 'fetching with wildcard that matches multiple refs' ' grep "want-ref refs/heads/o/bar" log ' +test_expect_success 'shallow clone with ref-in-want' ' + rm -rf local && + GIT_TEST_PROTOCOL_VERSION=2 git clone --depth=1 "file://$REPO" local && + git -C "$REPO" rev-parse main >expected && + git -C local rev-parse refs/remotes/origin/main >actual && + test_cmp expected actual && + git -C local log --oneline refs/remotes/origin/main >log && + test_line_count = 1 log +' + +test_expect_success 'incremental shallow fetch with ref-in-want' ' + rm -rf local && + GIT_TEST_PROTOCOL_VERSION=2 git clone --depth=1 "file://$REPO" local && + GIT_TEST_PROTOCOL_VERSION=2 git -C local fetch --depth=2 origin main && + git -C local log --oneline refs/remotes/origin/main >log && + test_line_count = 2 log +' + REPO="$(pwd)/repo-ns" test_expect_success 'setup namespaced repo' ' diff --git a/upload-pack.c b/upload-pack.c index 9f6d6fe48c..cc958c4c2d 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -1811,8 +1811,8 @@ int upload_pack_v2(struct repository *r, struct packet_reader *request) state = UPLOAD_DONE; break; case UPLOAD_SEND_PACK: - send_wanted_ref_info(&data); send_shallow_info(&data); + send_wanted_ref_info(&data); if (data.uri_protocols.nr) { create_pack_file(&data, &data.uri_protocols);