From: Kim Altintop Date: Wed, 04 Aug 2021 20:42:42 GMT Subject: [PATCH v3] upload-pack.c: treat want-ref relative to namespace Message-ID: <20210804203829.661565-1-kim@eagain.st> In-Reply-To: <20210731203415.618641-1-kim@eagain.st> When 'upload-pack' runs within the context of a git namespace, treat any 'want-ref' lines the client sends as relative to that namespace. Also check if the wanted ref is hidden via 'hideRefs'. If it is hidden, respond with an error as if the ref didn't exist. Helped-by: Jonathan Tan Signed-off-by: Kim Altintop --- Changes from v2: * upload-pack.c: release strbuf * t5730: revert to scoping to $REPO via subshell in setup * t5730: add "cross-check" tests as per review comments from Jonathan t/t5703-upload-pack-ref-in-want.sh | 128 +++++++++++++++++++++++++++++ upload-pack.c | 18 ++-- 2 files changed, 139 insertions(+), 7 deletions(-) diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index e9e471621d..4a828042bb 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -298,6 +298,134 @@ test_expect_success 'fetching with wildcard that matches multiple refs' ' grep "want-ref refs/heads/o/bar" log ' +REPO="$(pwd)/repo-ns" + +write_fetch_want_ref() { + local wanted_ref="$1" + + write_command fetch + echo "0001" + echo "no-progress" + echo "want-ref $1" + echo "done" + echo "0000" +} + +test_expect_success 'setup namespaced repo' ' + ( + git init -b main "$REPO" && + cd "$REPO" && + test_commit a && + test_commit b && + git checkout a && + test_commit c && + git checkout a && + test_commit d && + git update-ref refs/heads/ns-no b && + git update-ref refs/namespaces/ns/refs/heads/ns-yes c && + git update-ref refs/namespaces/ns/refs/heads/hidden d + ) && + git -C "$REPO" config uploadpack.allowRefInWant true +' + +test_expect_success 'with namespace: want-ref is considered relative to namespace' ' + wanted_ref=refs/heads/ns-yes && + + oid=$(git -C "$REPO" rev-parse $wanted_ref) && + cat >expected_refs <<-EOF && + $oid $wanted_ref + EOF + git -C "$REPO" rev-parse a $wanted_ref >expected_commits && + + test-tool pkt-line pack >in <<-EOF && + $(write_fetch_want_ref $wanted_ref) + EOF + + env GIT_NAMESPACE=ns test-tool -C "$REPO" serve-v2 --stateless-rpc >out in <<-EOF && + $(write_fetch_want_ref $wanted_ref) + EOF + + test_must_fail env GIT_NAMESPACE=ns \ + test-tool -C "$REPO" serve-v2 --stateless-rpc >out expected_refs <<-EOF && + $oid $wanted_ref + EOF + git -C "$REPO" rev-parse a $wanted_ref >expected_commits && + + test-tool pkt-line pack >in <<-EOF && + $(write_fetch_want_ref $wanted_ref) + EOF + + test-tool -C "$REPO" serve-v2 --stateless-rpc >out in <<-EOF && + $(write_fetch_want_ref $wanted_ref) + EOF + + test_must_fail env GIT_NAMESPACE=ns \ + test-tool -C "$REPO" serve-v2 --stateless-rpc >out