| #!/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 |