From: Junio C Hamano <gitster@pobox.com>
To: Royce Remer <royceremer@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v2] upload-pack: swap wanted-ref/shallow-info responses
Date: Wed, 16 Sep 2026 23:20:51 -0700 [thread overview]
Message-ID: <xmqqa4pgv1oc.fsf@gitster.g> (raw)
In-Reply-To: <20260916203221.5265-1-royceremer@gmail.com> (Royce Remer's message of "Wed, 16 Sep 2026 13:32:21 -0700")
Royce Remer <royceremer@gmail.com> writes:
> 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.
It seems that this bug existed in the very first set of patches that
introduced the ref-in-want feature, namely, 733020517a (fetch-pack:
implement ref-in-want, 2018-06-27) and 516e2b76bd (upload-pack:
implement ref-in-want, 2018-06-27). There were a few changes on the
code around that area, but on-the-wire protocol never changed, so it
never worked correctly, but the ref-in-want feature is a rather
exotic thing to want in the first place, so it is not all that
unexpected.
>
> Signed-off-by: Royce Remer <royceremer@gmail.com>
> ---
> 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 a52856d869..a70d237ad3 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -1812,8 +1812,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);
>
> base-commit: e9019fcafe0040228b8631c30f97ae1adb61bcdc
prev parent reply other threads:[~2026-09-17 6:20 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 19:30 [PATCH] [PATCH] Fix upload_pack_v2 response ordering for shallow fetch when server has uploadpack.allowRefInWant=true Royce Remer
2026-09-15 19:58 ` Junio C Hamano
2026-09-15 20:19 ` Junio C Hamano
2026-09-15 21:03 ` Royce Gerard Remer
2026-09-16 16:43 ` Junio C Hamano
2026-09-16 20:32 ` [PATCH v2] upload-pack: swap wanted-ref/shallow-info responses Royce Remer
2026-09-17 6:20 ` Junio C Hamano [this message]
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=xmqqa4pgv1oc.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=royceremer@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.