| #!/bin/sh |
| |
| test_description='fetch/push functionality using the HTTP protocol' |
| |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| |
| . ./test-lib.sh |
| . "$TEST_DIRECTORY"/lib-httpd.sh |
| start_httpd |
| |
| SERVER="$HTTPD_DOCUMENT_ROOT_PATH/server" |
| URI="$HTTPD_URL/smart/server" |
| |
| grep_wrote () { |
| object_count=$1 |
| file_name=$2 |
| grep 'write_pack_file/wrote.*"value":"'$1'"' $2 |
| } |
| |
| setup_client_and_server () { |
| git init client && |
| test_when_finished 'rm -rf client' && |
| test_commit -C client first_commit && |
| test_commit -C client second_commit && |
| |
| git init "$SERVER" && |
| test_when_finished 'rm -rf "$SERVER"' && |
| test_config -C "$SERVER" http.receivepack true && |
| test_commit -C "$SERVER" unrelated_commit && |
| git -C client push "$URI" first_commit:refs/remotes/origin/first_commit && |
| git -C "$SERVER" config receive.hideRefs refs/remotes/origin/first_commit |
| } |
| |
| test_expect_success 'push without negotiation (for comparing object counts with the next test)' ' |
| setup_client_and_server && |
| |
| GIT_TRACE2_EVENT="$(pwd)/event" git -C client -c protocol.version=2 \ |
| push "$URI" refs/heads/main:refs/remotes/origin/main && |
| test_when_finished "rm -f event" && |
| grep_wrote 6 event # 2 commits, 2 trees, 2 blobs |
| ' |
| |
| test_expect_success 'push with negotiation' ' |
| setup_client_and_server && |
| |
| GIT_TRACE2_EVENT="$(pwd)/event" git -C client -c protocol.version=2 -c push.negotiate=1 \ |
| push "$URI" refs/heads/main:refs/remotes/origin/main && |
| test_when_finished "rm -f event" && |
| grep_wrote 3 event # 1 commit, 1 tree, 1 blob |
| ' |
| |
| test_expect_success 'push with negotiation proceeds anyway even if negotiation fails' ' |
| setup_client_and_server && |
| |
| # Use protocol v0 to make negotiation fail (because protocol v0 does |
| # not support the "wait-for-done" capability, which is required for |
| # push negotiation) |
| GIT_TEST_PROTOCOL_VERSION=0 GIT_TRACE2_EVENT="$(pwd)/event" git -C client -c push.negotiate=1 \ |
| push "$URI" refs/heads/main:refs/remotes/origin/main 2>err && |
| test_when_finished "rm -f event" && |
| grep_wrote 6 event && # 2 commits, 2 trees, 2 blobs |
| |
| cat >warning-expect <<-EOF && |
| warning: --negotiate-only requires protocol v2 |
| warning: push negotiation failed; proceeding anyway with push |
| EOF |
| grep warning: err >warning-actual && |
| test_cmp warning-expect warning-actual |
| ' |
| |
| test_done |