diff options
Diffstat (limited to 't/t5703-upload-pack-ref-in-want.sh')
-rwxr-xr-x | t/t5703-upload-pack-ref-in-want.sh | 287 |
1 files changed, 213 insertions, 74 deletions
diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index 748282f..1910971 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -16,7 +16,8 @@ get_actual_commits () { test-tool pkt-line unpack-sideband <out >o.pack && git index-pack o.pack && git verify-pack -v o.idx >objs && - grep commit objs | cut -d" " -f1 | sort >actual_commits + sed -n -e 's/\([0-9a-f][0-9a-f]*\) commit .*/\1/p' objs >objs.sed && + sort >actual_commits <objs.sed } check_output () { @@ -36,15 +37,39 @@ write_command () { fi } +# Write a complete fetch command to stdout, suitable for use with `test-tool +# pkt-line`. "want-ref", "want", and "have" lines are read from stdin. +# +# Examples: +# +# write_fetch_command <<-EOF +# want-ref refs/heads/main +# have $(git rev-parse a) +# EOF +# +# write_fetch_command <<-EOF +# want $(git rev-parse b) +# have $(git rev-parse a) +# EOF +# +write_fetch_command () { + write_command fetch && + echo "0001" && + echo "no-progress" && + cat && + echo "done" && + echo "0000" +} + # c(o/foo) d(o/bar) # \ / -# b e(baz) f(master) +# b e(baz) f(main) # \__ | __/ # \ | / # a test_expect_success 'setup repository' ' - test_oid_init && test_commit a && + git branch -M main && git checkout -b o/foo && test_commit b && test_commit c && @@ -52,7 +77,7 @@ test_expect_success 'setup repository' ' test_commit d && git checkout -b baz a && test_commit e && - git checkout master && + git checkout main && test_commit f ' @@ -73,15 +98,11 @@ test_expect_success 'config controls ref-in-want advertisement' ' ' test_expect_success 'invalid want-ref line' ' - test-tool pkt-line pack >in <<-EOF && - $(write_command fetch) - 0001 - no-progress + write_fetch_command >pkt <<-EOF && want-ref refs/heads/non-existent - done - 0000 EOF + test-tool pkt-line pack <pkt >in && test_must_fail test-tool serve-v2 --stateless-rpc 2>out <in && grep "unknown ref" out ' @@ -89,20 +110,15 @@ test_expect_success 'invalid want-ref line' ' test_expect_success 'basic want-ref' ' oid=$(git rev-parse f) && cat >expected_refs <<-EOF && - $oid refs/heads/master + $oid refs/heads/main EOF git rev-parse f >expected_commits && - oid=$(git rev-parse a) && - test-tool pkt-line pack >in <<-EOF && - $(write_command fetch) - 0001 - no-progress - want-ref refs/heads/master - have $oid - done - 0000 + write_fetch_command >pkt <<-EOF && + want-ref refs/heads/main + have $(git rev-parse a) EOF + test-tool pkt-line pack <pkt >in && test-tool serve-v2 --stateless-rpc >out <in && check_output @@ -117,17 +133,12 @@ test_expect_success 'multiple want-ref lines' ' EOF git rev-parse c d >expected_commits && - oid=$(git rev-parse b) && - test-tool pkt-line pack >in <<-EOF && - $(write_command fetch) - 0001 - no-progress + write_fetch_command >pkt <<-EOF && want-ref refs/heads/o/foo want-ref refs/heads/o/bar - have $oid - done - 0000 + have $(git rev-parse b) EOF + test-tool pkt-line pack <pkt >in && test-tool serve-v2 --stateless-rpc >out <in && check_output @@ -136,20 +147,16 @@ test_expect_success 'multiple want-ref lines' ' test_expect_success 'mix want and want-ref' ' oid=$(git rev-parse f) && cat >expected_refs <<-EOF && - $oid refs/heads/master + $oid refs/heads/main EOF git rev-parse e f >expected_commits && - test-tool pkt-line pack >in <<-EOF && - $(write_command fetch) - 0001 - no-progress - want-ref refs/heads/master + write_fetch_command >pkt <<-EOF && + want-ref refs/heads/main want $(git rev-parse e) have $(git rev-parse a) - done - 0000 EOF + test-tool pkt-line pack <pkt >in && test-tool serve-v2 --stateless-rpc >out <in && check_output @@ -162,16 +169,11 @@ test_expect_success 'want-ref with ref we already have commit for' ' EOF >expected_commits && - oid=$(git rev-parse c) && - test-tool pkt-line pack >in <<-EOF && - $(write_command fetch) - 0001 - no-progress + write_fetch_command >pkt <<-EOF && want-ref refs/heads/o/foo - have $oid - done - 0000 + have $(git rev-parse c) EOF + test-tool pkt-line pack <pkt >in && test-tool serve-v2 --stateless-rpc >out <in && check_output @@ -183,7 +185,7 @@ LOCAL_PRISTINE="$(pwd)/local_pristine" # $REPO # c(o/foo) d(o/bar) # \ / -# b e(baz) f(master) +# b e(baz) f(main) # \__ | __/ # \ | / # a @@ -194,10 +196,10 @@ LOCAL_PRISTINE="$(pwd)/local_pristine" # . # . # | -# a(master) +# a(main) test_expect_success 'setup repos for fetching with ref-in-want tests' ' ( - git init "$REPO" && + git init -b main "$REPO" && cd "$REPO" && test_commit a && @@ -210,7 +212,7 @@ test_expect_success 'setup repos for fetching with ref-in-want tests' ' test_commit_bulk --id=s 33 && # Add novel commits to upstream - git checkout master && + git checkout main && cd "$REPO" && git checkout -b o/foo && test_commit b && @@ -219,7 +221,7 @@ test_expect_success 'setup repos for fetching with ref-in-want tests' ' test_commit d && git checkout -b baz a && test_commit e && - git checkout master && + git checkout main && test_commit f ) && git -C "$REPO" config uploadpack.allowRefInWant true && @@ -227,14 +229,16 @@ test_expect_success 'setup repos for fetching with ref-in-want tests' ' ' test_expect_success 'fetching with exact OID' ' - test_when_finished "rm -f log" && + test_when_finished "rm -f log trace2" && rm -rf local && cp -r "$LOCAL_PRISTINE" local && oid=$(git -C "$REPO" rev-parse d) && - GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin \ + GIT_TRACE_PACKET="$(pwd)/log" GIT_TRACE2_EVENT="$(pwd)/trace2" \ + git -C local fetch origin \ "$oid":refs/heads/actual && + grep \"key\":\"total_rounds\",\"value\":\"2\" trace2 && git -C "$REPO" rev-parse "d" >expected && git -C local rev-parse refs/heads/actual >actual && test_cmp expected actual && @@ -246,12 +250,12 @@ test_expect_success 'fetching multiple refs' ' rm -rf local && cp -r "$LOCAL_PRISTINE" local && - GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin master baz && + GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin main baz && - git -C "$REPO" rev-parse "master" "baz" >expected && - git -C local rev-parse refs/remotes/origin/master refs/remotes/origin/baz >actual && + git -C "$REPO" rev-parse "main" "baz" >expected && + git -C local rev-parse refs/remotes/origin/main refs/remotes/origin/baz >actual && test_cmp expected actual && - grep "want-ref refs/heads/master" log && + grep "want-ref refs/heads/main" log && grep "want-ref refs/heads/baz" log ' @@ -262,13 +266,13 @@ test_expect_success 'fetching ref and exact OID' ' cp -r "$LOCAL_PRISTINE" local && oid=$(git -C "$REPO" rev-parse b) && GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin \ - master "$oid":refs/heads/actual && + main "$oid":refs/heads/actual && - git -C "$REPO" rev-parse "master" "b" >expected && - git -C local rev-parse refs/remotes/origin/master refs/heads/actual >actual && + git -C "$REPO" rev-parse "main" "b" >expected && + git -C local rev-parse refs/remotes/origin/main refs/heads/actual >actual && test_cmp expected actual && grep "want $oid" log && - grep "want-ref refs/heads/master" log + grep "want-ref refs/heads/main" log ' test_expect_success 'fetching with wildcard that does not match any refs' ' @@ -294,6 +298,141 @@ 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 +' + +test_expect_success 'with namespace: want-ref is considered relative to namespace' ' + wanted_ref=refs/heads/ns-yes && + + oid=$(git -C "$REPO" rev-parse "refs/namespaces/ns/$wanted_ref") && + cat >expected_refs <<-EOF && + $oid $wanted_ref + EOF + cat >expected_commits <<-EOF && + $oid + $(git -C "$REPO" rev-parse a) + EOF + + write_fetch_command >pkt <<-EOF && + want-ref $wanted_ref + EOF + test-tool pkt-line pack <pkt >in && + + GIT_NAMESPACE=ns test-tool -C "$REPO" serve-v2 --stateless-rpc >out <in && + check_output +' + +test_expect_success 'with namespace: want-ref outside namespace is unknown' ' + wanted_ref=refs/heads/ns-no && + + write_fetch_command >pkt <<-EOF && + want-ref $wanted_ref + EOF + test-tool pkt-line pack <pkt >in && + + test_must_fail env GIT_NAMESPACE=ns \ + test-tool -C "$REPO" serve-v2 --stateless-rpc >out <in && + grep "unknown ref" out +' + +# Cross-check refs/heads/ns-no indeed exists +test_expect_success 'without namespace: want-ref outside namespace succeeds' ' + wanted_ref=refs/heads/ns-no && + + oid=$(git -C "$REPO" rev-parse $wanted_ref) && + cat >expected_refs <<-EOF && + $oid $wanted_ref + EOF + cat >expected_commits <<-EOF && + $oid + $(git -C "$REPO" rev-parse a) + EOF + + write_fetch_command >pkt <<-EOF && + want-ref $wanted_ref + EOF + test-tool pkt-line pack <pkt >in && + + test-tool -C "$REPO" serve-v2 --stateless-rpc >out <in && + check_output +' + +test_expect_success 'with namespace: hideRefs is matched, relative to namespace' ' + wanted_ref=refs/heads/hidden && + git -C "$REPO" config transfer.hideRefs $wanted_ref && + + write_fetch_command >pkt <<-EOF && + want-ref $wanted_ref + EOF + test-tool pkt-line pack <pkt >in && + + test_must_fail env GIT_NAMESPACE=ns \ + test-tool -C "$REPO" serve-v2 --stateless-rpc >out <in && + grep "unknown ref" out +' + +# Cross-check refs/heads/hidden indeed exists +test_expect_success 'with namespace: want-ref succeeds if hideRefs is removed' ' + wanted_ref=refs/heads/hidden && + git -C "$REPO" config --unset transfer.hideRefs $wanted_ref && + + oid=$(git -C "$REPO" rev-parse "refs/namespaces/ns/$wanted_ref") && + cat >expected_refs <<-EOF && + $oid $wanted_ref + EOF + cat >expected_commits <<-EOF && + $oid + $(git -C "$REPO" rev-parse a) + EOF + + write_fetch_command >pkt <<-EOF && + want-ref $wanted_ref + EOF + test-tool pkt-line pack <pkt >in && + + GIT_NAMESPACE=ns test-tool -C "$REPO" serve-v2 --stateless-rpc >out <in && + check_output +' + +test_expect_success 'without namespace: relative hideRefs does not match' ' + wanted_ref=refs/namespaces/ns/refs/heads/hidden && + git -C "$REPO" config transfer.hideRefs refs/heads/hidden && + + oid=$(git -C "$REPO" rev-parse $wanted_ref) && + cat >expected_refs <<-EOF && + $oid $wanted_ref + EOF + cat >expected_commits <<-EOF && + $oid + $(git -C "$REPO" rev-parse a) + EOF + + write_fetch_command >pkt <<-EOF && + want-ref $wanted_ref + EOF + test-tool pkt-line pack <pkt >in && + + test-tool -C "$REPO" serve-v2 --stateless-rpc >out <in && + check_output +' + + . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -302,7 +441,7 @@ LOCAL_PRISTINE="$(pwd)/local_pristine" test_expect_success 'setup repos for change-while-negotiating test' ' ( - git init "$REPO" && + git init -b main "$REPO" && cd "$REPO" && >.git/git-daemon-export-ok && test_commit m1 && @@ -317,7 +456,7 @@ test_expect_success 'setup repos for change-while-negotiating test' ' test_commit_bulk --id=s 33 && # Add novel commits to upstream - git checkout master && + git checkout main && cd "$REPO" && test_commit m2 && test_commit m3 && @@ -343,20 +482,20 @@ test_expect_success 'server is initially ahead - no ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant false && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master $(test_oid numeric) && + inconsistency main $(test_oid numeric) && test_must_fail git -C local fetch 2>err && - test_i18ngrep "fatal: remote error: upload-pack: not our ref" err + test_grep "fatal: remote error: upload-pack: not our ref" err ' test_expect_success 'server is initially ahead - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master $(test_oid numeric) && + inconsistency main $(test_oid numeric) && git -C local fetch && - git -C "$REPO" rev-parse --verify master >expected && - git -C local rev-parse --verify refs/remotes/origin/master >actual && + git -C "$REPO" rev-parse --verify main >expected && + git -C local rev-parse --verify refs/remotes/origin/main >actual && test_cmp expected actual ' @@ -364,11 +503,11 @@ test_expect_success 'server is initially behind - no ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant false && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master "master^" && + inconsistency main "main^" && git -C local fetch && - git -C "$REPO" rev-parse --verify "master^" >expected && - git -C local rev-parse --verify refs/remotes/origin/master >actual && + git -C "$REPO" rev-parse --verify "main^" >expected && + git -C local rev-parse --verify refs/remotes/origin/main >actual && test_cmp expected actual ' @@ -376,11 +515,11 @@ test_expect_success 'server is initially behind - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master "master^" && + inconsistency main "main^" && git -C local fetch && - git -C "$REPO" rev-parse --verify "master" >expected && - git -C local rev-parse --verify refs/remotes/origin/master >actual && + git -C "$REPO" rev-parse --verify "main" >expected && + git -C local rev-parse --verify refs/remotes/origin/main >actual && test_cmp expected actual ' @@ -388,10 +527,10 @@ test_expect_success 'server loses a ref - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - echo "s/master/raster/" >"$HTTPD_ROOT_PATH/one-time-perl" && + echo "s/main/rain/" >"$HTTPD_ROOT_PATH/one-time-perl" && test_must_fail git -C local fetch 2>err && - test_i18ngrep "fatal: remote error: unknown ref refs/heads/raster" err + test_grep "fatal: remote error: unknown ref refs/heads/rain" err ' # DO NOT add non-httpd-specific tests here, because the last part of this |