From: Kim Altintop Date: Sat, 31 Jul 2021 20:36:59 GMT Subject: [PATCH v2] upload-pack.c: treat want-ref relative to namespace Message-ID: <20210731203415.618641-1-kim@eagain.st> In-Reply-To: <20210730135845.633234-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. Signed-off-by: Kim Altintop --- Changes from v1: * Amend commit message * upload-pack.c: fix variable renaming (how could this even work?) * upload-pack.c: hide namespace in all output, including die() * t5703: don't use subshell in repo setup * t5703: use "env" keyword to correctly scope GIT_NAMESPACE t/t5703-upload-pack-ref-in-want.sh | 72 ++++++++++++++++++++++++++++++ upload-pack.c | 17 ++++--- 2 files changed, 82 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..96df3073d1 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -298,6 +298,78 @@ test_expect_success 'fetching with wildcard that matches multiple refs' ' grep "want-ref refs/heads/o/bar" log ' +REPO="$(pwd)/repo-ns" + +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 && + git -C "$REPO" config transfer.hideRefs refs/heads/hidden +' + +test_expect_success 'want-ref with namespaces' ' + oid=$(git -C "$REPO" rev-parse c) && + cat >expected_refs <<-EOF && + $oid refs/heads/ns-yes + EOF + >expected_commits && + + oid=$(git -C "$REPO" rev-parse c) && + test-tool pkt-line pack >in <<-EOF && + $(write_command fetch) + 0001 + no-progress + want-ref refs/heads/ns-yes + have $oid + done + 0000 + EOF + + env GIT_NAMESPACE=ns test-tool -C "$REPO" serve-v2 --stateless-rpc >out in <<-EOF && + $(write_command fetch) + 0001 + no-progress + want-ref refs/heads/ns-no + have $oid + done + 0000 + EOF + + test_must_fail env GIT_NAMESPACE=ns test-tool -C "$REPO" serve-v2 --stateless-rpc >out in <<-EOF && + $(write_command fetch) + 0001 + no-progress + want-ref refs/heads/hidden + have $oid + done + 0000 + EOF + + test_must_fail env GIT_NAMESPACE=ns test-tool -C "$REPO" serve-v2 --stateless-rpc >out util = oiddup(&oid); - o = parse_object_or_die(&oid, arg); + o = parse_object_or_die(&oid, refname_nons); if (!(o->flags & WANTED)) { o->flags |= WANTED; add_object_array(o, NULL, want_obj); -- 2.32.0