| #!/bin/sh |
| |
| test_description='git cat-file --batch-command with remote-object-info command' |
| |
| . ./test-lib.sh |
| . "$TEST_DIRECTORY"/lib-cat-file.sh |
| |
| hello_content="Hello World" |
| hello_size=$(strlen "$hello_content") |
| hello_oid=$(echo_without_newline "$hello_content" | git hash-object --stdin) |
| hello_short_oid=$(git rev-parse --short "$hello_oid") |
| |
| unstored_content="Hello Git" |
| unstored_oid=$(echo_without_newline "$unstored_content" | git hash-object --stdin) |
| |
| # This is how we get 13: |
| # 13 = <file mode> + <a_space> + <file name> + <a_null>, where |
| # file mode is 100644, which is 6 characters; |
| # file name is hello, which is 5 characters |
| # a space is 1 character and a null is 1 character |
| tree_size=$(($(test_oid rawsz) + 13)) |
| |
| commit_message="Initial commit" |
| |
| # This is how we get 137: |
| # 137 = <tree header> + <a_space> + <a newline> + |
| # <Author line> + <a newline> + |
| # <Committer line> + <a newline> + |
| # <a newline> + |
| # <commit message length> |
| # An easier way to calculate is: 1. use `git cat-file commit <commit hash> | wc -c`, |
| # to get 177, 2. then deduct 40 hex characters to get 137 |
| commit_size=$(($(test_oid hexsz) + 137)) |
| |
| tag_header_without_oid="type blob |
| tag hellotag |
| tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" |
| tag_header_without_timestamp="object $hello_oid |
| $tag_header_without_oid" |
| tag_description="This is a tag" |
| tag_content="$tag_header_without_timestamp 0 +0000 |
| |
| $tag_description" |
| |
| tag_oid=$(echo_without_newline "$tag_content" | git hash-object -t tag --stdin -w) |
| tag_size=$(strlen "$tag_content") |
| |
| set_transport_variables () { |
| hello_oid=$(echo_without_newline "$hello_content" | git hash-object --stdin) |
| tree_oid=$(git -C "$1" write-tree) |
| commit_oid=$(echo_without_newline "$commit_message" | git -C "$1" commit-tree $tree_oid) |
| tag_oid=$(echo_without_newline "$tag_content" | git -C "$1" hash-object -t tag --stdin -w) |
| tag_size=$(strlen "$tag_content") |
| } |
| |
| # This section tests --batch-command with remote-object-info command |
| # Since "%(objecttype)" is currently not supported by the command remote-object-info , |
| # the filters are set to "%(objectname) %(objectsize)" in some test cases. |
| |
| # Test --batch-command remote-object-info with 'git://' transport with |
| # transfer.advertiseobjectinfo set to true, i.e. server has object-info capability |
| . "$TEST_DIRECTORY"/lib-git-daemon.sh |
| start_git_daemon --export-all |
| daemon_parent=$GIT_DAEMON_DOCUMENT_ROOT_PATH/parent |
| |
| test_expect_success 'create repo to be served by git-daemon' ' |
| git init "$daemon_parent" && |
| echo_without_newline "$hello_content" > $daemon_parent/hello && |
| git -C "$daemon_parent" update-index --add hello && |
| git -C "$daemon_parent" config transfer.advertiseobjectinfo true && |
| git clone "$GIT_DAEMON_URL/parent" -n "$daemon_parent/daemon_client_empty" |
| ' |
| |
| test_expect_success 'batch-command remote-object-info git://' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid |
| remote-object-info "$GIT_DAEMON_URL/parent" $tree_oid |
| remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid |
| remote-object-info "$GIT_DAEMON_URL/parent" $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command remote-object-info git:// multiple sha1 per line' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command remote-object-info git:// default filter' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| git cat-file --batch-command >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid |
| remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info does not change the default format of info' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| local_content="local object" && |
| local_oid=$(echo_without_newline "$local_content" | git hash-object -w --stdin) && |
| local_size=$(strlen "$local_content") && |
| |
| echo "$local_oid blob $local_size" >expect && |
| echo "$hello_oid $hello_size" >>expect && |
| echo "$local_oid blob $local_size" >>expect && |
| |
| git cat-file --batch-command >actual <<-EOF && |
| info $local_oid |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid |
| info $local_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command --buffer remote-object-info git://' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid |
| remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| flush |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command -Z remote-object-info git:// default filter' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| printf "%s\0" "$hello_oid $hello_size" >expect && |
| printf "%s\0" "$tree_oid $tree_size" >>expect && |
| printf "%s\0" "$commit_oid $commit_size" >>expect && |
| printf "%s\0" "$tag_oid $tag_size" >>expect && |
| |
| printf "%s\0" "$hello_oid missing" >>expect && |
| printf "%s\0" "$tree_oid missing" >>expect && |
| printf "%s\0" "$commit_oid missing" >>expect && |
| printf "%s\0" "$tag_oid missing" >>expect && |
| |
| batch_input="remote-object-info $GIT_DAEMON_URL/parent $hello_oid $tree_oid |
| remote-object-info $GIT_DAEMON_URL/parent $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| " && |
| echo_without_newline_nul "$batch_input" >commands_null_delimited && |
| |
| git cat-file --batch-command -Z < commands_null_delimited >actual && |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info does not support short oids' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| test_must_fail git cat-file --batch-command 2>err <<-EOF && |
| remote-object-info $GIT_DAEMON_URL/parent $hello_short_oid |
| EOF |
| test_grep "does not support short oids" err |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info does not die on missing oid like info' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| git cat-file --batch-command >local <<-EOF && |
| info $unstored_oid |
| EOF |
| git cat-file --batch-command >remote <<-EOF && |
| remote-object-info $GIT_DAEMON_URL/parent $unstored_oid |
| EOF |
| test_cmp local remote |
| ) |
| ' |
| |
| # This tests depends on %(objecttype) not being supported yet, once supported |
| # it needs to be updated. |
| test_expect_success 'unsupported placeholder on remote returns empty string' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| echo "" >expect && |
| git cat-file --batch-command="%(objecttype)" >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'requesting only objectname echoes back' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| echo $hello_oid >expect && |
| git cat-file --batch-command="%(objectname)" >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'objectname goes through existence check' ' |
| ( |
| set_transport_variables "$daemon_parent" && |
| cd "$daemon_parent/daemon_client_empty" && |
| |
| echo "$unstored_oid missing" >expect && |
| |
| git cat-file --batch-command="%(objectname)" >actual <<-EOF && |
| remote-object-info "$GIT_DAEMON_URL/parent" $unstored_oid |
| EOF |
| |
| test_cmp expect actual |
| ) |
| ' |
| |
| # Test --batch-command remote-object-info with 'git://' and |
| # transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability |
| test_expect_success 'batch-command remote-object-info git:// fails when transfer.advertiseobjectinfo=false' ' |
| ( |
| git -C "$daemon_parent" config transfer.advertiseobjectinfo false && |
| set_transport_variables "$daemon_parent" && |
| |
| test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF && |
| remote-object-info $GIT_DAEMON_URL/parent $hello_oid $tree_oid $commit_oid $tag_oid |
| EOF |
| test_grep "object-info capability is not enabled on the server" err && |
| |
| # revert server state back |
| git -C "$daemon_parent" config transfer.advertiseobjectinfo true |
| |
| ) |
| ' |
| |
| stop_git_daemon |
| |
| # Test --batch-command remote-object-info with 'file://' transport with |
| # transfer.advertiseobjectinfo set to true, i.e. server has object-info capability |
| # shellcheck disable=SC2016 |
| test_expect_success 'create repo to be served by file:// transport' ' |
| git init server && |
| git -C server config protocol.version 2 && |
| git -C server config transfer.advertiseobjectinfo true && |
| echo_without_newline "$hello_content" > server/hello && |
| git -C server update-index --add hello && |
| git clone -n "file://$(pwd)/server" file_client_empty |
| ' |
| |
| test_expect_success 'batch-command remote-object-info file://' ' |
| ( |
| set_transport_variables "server" && |
| server_path="$(pwd)/server" && |
| cd file_client_empty && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF && |
| remote-object-info "file://${server_path}" $hello_oid |
| remote-object-info "file://${server_path}" $tree_oid |
| remote-object-info "file://${server_path}" $commit_oid |
| remote-object-info "file://${server_path}" $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command remote-object-info file:// multiple sha1 per line' ' |
| ( |
| set_transport_variables "server" && |
| server_path="$(pwd)/server" && |
| cd file_client_empty && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF && |
| remote-object-info "file://${server_path}" $hello_oid $tree_oid $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command --buffer remote-object-info file://' ' |
| ( |
| set_transport_variables "server" && |
| server_path="$(pwd)/server" && |
| cd file_client_empty && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF && |
| remote-object-info "file://${server_path}" $hello_oid $tree_oid |
| remote-object-info "file://${server_path}" $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| flush |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command remote-object-info file:// default filter' ' |
| ( |
| set_transport_variables "server" && |
| server_path="$(pwd)/server" && |
| cd file_client_empty && |
| |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| git cat-file --batch-command >actual <<-EOF && |
| remote-object-info "file://${server_path}" $hello_oid $tree_oid |
| remote-object-info "file://${server_path}" $commit_oid $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command -Z remote-object-info file:// default filter' ' |
| ( |
| set_transport_variables "server" && |
| server_path="$(pwd)/server" && |
| cd file_client_empty && |
| |
| printf "%s\0" "$hello_oid $hello_size" >expect && |
| printf "%s\0" "$tree_oid $tree_size" >>expect && |
| printf "%s\0" "$commit_oid $commit_size" >>expect && |
| printf "%s\0" "$tag_oid $tag_size" >>expect && |
| |
| printf "%s\0" "$hello_oid missing" >>expect && |
| printf "%s\0" "$tree_oid missing" >>expect && |
| printf "%s\0" "$commit_oid missing" >>expect && |
| printf "%s\0" "$tag_oid missing" >>expect && |
| |
| batch_input="remote-object-info \"file://${server_path}\" $hello_oid $tree_oid |
| remote-object-info \"file://${server_path}\" $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| " && |
| echo_without_newline_nul "$batch_input" >commands_null_delimited && |
| |
| git cat-file --batch-command -Z < commands_null_delimited >actual && |
| test_cmp expect actual |
| ) |
| ' |
| |
| # Test --batch-command remote-object-info with 'file://' and |
| # transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability |
| test_expect_success 'batch-command remote-object-info file:// fails when transfer.advertiseobjectinfo=false' ' |
| ( |
| set_transport_variables "server" && |
| server_path="$(pwd)/server" && |
| git -C "${server_path}" config transfer.advertiseobjectinfo false && |
| |
| test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF && |
| remote-object-info "file://${server_path}" $hello_oid $tree_oid $commit_oid $tag_oid |
| EOF |
| test_grep "object-info capability is not enabled on the server" err && |
| |
| # revert server state back |
| git -C "${server_path}" config transfer.advertiseobjectinfo true |
| ) |
| ' |
| |
| # Test --batch-command remote-object-info with 'http://' transport with |
| # transfer.advertiseobjectinfo set to true, i.e. server has object-info capability |
| |
| . "$TEST_DIRECTORY"/lib-httpd.sh |
| start_httpd |
| |
| test_expect_success 'create repo to be served by http:// transport' ' |
| git init "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config http.receivepack true && |
| git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo true && |
| echo_without_newline "$hello_content" > $HTTPD_DOCUMENT_ROOT_PATH/http_parent/hello && |
| git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" update-index --add hello && |
| git clone "$HTTPD_URL/smart/http_parent" -n "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" |
| ' |
| |
| test_expect_success 'batch-command remote-object-info http://' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid |
| remote-object-info "$HTTPD_URL/smart/http_parent" $tree_oid |
| remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid |
| remote-object-info "$HTTPD_URL/smart/http_parent" $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command remote-object-info http:// one line' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command --buffer remote-object-info http://' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" && |
| |
| # These results prove remote-object-info can get object info from the remote |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| # These results prove remote-object-info did not download objects from the remote |
| echo "$hello_oid missing" >>expect && |
| echo "$tree_oid missing" >>expect && |
| echo "$commit_oid missing" >>expect && |
| echo "$tag_oid missing" >>expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid |
| remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid $tag_oid |
| info $hello_oid |
| info $tree_oid |
| info $commit_oid |
| info $tag_oid |
| flush |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command remote-object-info http:// default filter' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" && |
| |
| echo "$hello_oid $hello_size" >expect && |
| echo "$tree_oid $tree_size" >>expect && |
| echo "$commit_oid $commit_size" >>expect && |
| echo "$tag_oid $tag_size" >>expect && |
| |
| git cat-file --batch-command >actual <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid |
| remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid $tag_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'batch-command -Z remote-object-info http:// default filter' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" && |
| |
| printf "%s\0" "$hello_oid $hello_size" >expect && |
| printf "%s\0" "$tree_oid $tree_size" >>expect && |
| printf "%s\0" "$commit_oid $commit_size" >>expect && |
| printf "%s\0" "$tag_oid $tag_size" >>expect && |
| |
| batch_input="remote-object-info $HTTPD_URL/smart/http_parent $hello_oid $tree_oid |
| remote-object-info $HTTPD_URL/smart/http_parent $commit_oid $tag_oid |
| " && |
| echo_without_newline_nul "$batch_input" >commands_null_delimited && |
| |
| git cat-file --batch-command -Z < commands_null_delimited >actual && |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on unsupported filter option (objectsize:disk)' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| |
| echo "$hello_oid " >expect && |
| |
| git cat-file --batch-command="%(objectname) %(objectsize:disk)" >actual <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on unsupported filter option (deltabase)' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| |
| echo "" >expect && |
| |
| git cat-file --batch-command="%(deltabase)" >actual <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid |
| EOF |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on server with legacy protocol' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| |
| test_must_fail git -c protocol.version=0 cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid |
| EOF |
| test_grep "object-info requires protocol v2" err |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on server with legacy protocol with default filter' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| |
| test_must_fail git -c protocol.version=0 cat-file --batch-command 2>err <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid |
| EOF |
| test_grep "object-info requires protocol v2" err |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on malformed OID' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| malformed_object_id="this_id_is_not_valid" && |
| |
| test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $malformed_object_id |
| EOF |
| test_grep "not a valid object name '$malformed_object_id'" err |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on malformed OID with default filter' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| malformed_object_id="this_id_is_not_valid" && |
| |
| test_must_fail git cat-file --batch-command 2>err <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $malformed_object_id |
| EOF |
| test_grep "not a valid object name '$malformed_object_id'" err |
| ) |
| ' |
| |
| test_expect_success 'remote-object-info fails on not providing OID' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| |
| test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" |
| EOF |
| test_grep "remote-object-info requires objects" err |
| ) |
| ' |
| |
| |
| # Test --batch-command remote-object-info with 'http://' transport and |
| # transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability |
| test_expect_success 'batch-command remote-object-info http:// fails when transfer.advertiseobjectinfo=false ' ' |
| ( |
| set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && |
| git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo false && |
| |
| test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF && |
| remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid $commit_oid $tag_oid |
| EOF |
| test_grep "object-info capability is not enabled on the server" err && |
| |
| # revert server state back |
| git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo true |
| ) |
| ' |
| |
| # DO NOT add non-httpd-specific tests here, because the last part of this |
| # test script is only executed when httpd is available and enabled. |
| |
| test_done |