Merge branch 'jk/http-push-status-fix'

"git push" client talking to an HTTP server did not diagnose the
lack of the final status report from the other side correctly,
which has been corrected.

* jk/http-push-status-fix:
  transport-helper: recognize "expecting report" error from send-pack
  send-pack: complain about "expecting report" with --helper-status
This commit is contained in:
Junio C Hamano 2021-10-29 15:43:12 -07:00
commit 735907bde1
6 changed files with 35 additions and 0 deletions

View File

@ -87,6 +87,10 @@ static void print_helper_status(struct ref *ref)
break;
case REF_STATUS_EXPECTING_REPORT:
res = "error";
msg = "expecting report";
break;
default:
continue;
}

View File

@ -131,6 +131,7 @@ prepare_httpd() {
cp "$TEST_PATH"/passwd "$HTTPD_ROOT_PATH"
install_script incomplete-length-upload-pack-v2-http.sh
install_script incomplete-body-upload-pack-v2-http.sh
install_script error-no-report.sh
install_script broken-smart-http.sh
install_script error-smart-http.sh
install_script error.sh

View File

@ -122,6 +122,7 @@ Alias /auth/dumb/ www/auth/dumb/
</LocationMatch>
ScriptAlias /smart/incomplete_length/git-upload-pack incomplete-length-upload-pack-v2-http.sh/
ScriptAlias /smart/incomplete_body/git-upload-pack incomplete-body-upload-pack-v2-http.sh/
ScriptAlias /smart/no_report/git-receive-pack error-no-report.sh/
ScriptAliasMatch /error_git_upload_pack/(.*)/git-upload-pack error.sh/
ScriptAliasMatch /smart_*[^/]*/(.*) ${GIT_EXEC_PATH}/git-http-backend/$1
ScriptAlias /broken_smart/ broken-smart-http.sh/
@ -137,6 +138,9 @@ ScriptAliasMatch /one_time_perl/(.*) apply-one-time-perl.sh/$1
<Files incomplete-body-upload-pack-v2-http.sh>
Options ExecCGI
</Files>
<Files error-no-report.sh>
Options ExecCGI
</Files>
<Files broken-smart-http.sh>
Options ExecCGI
</Files>

View File

@ -0,0 +1,6 @@
echo "Content-Type: application/x-git-receive-pack-result"
echo
printf '0013\001000eunpack ok\n'
printf '0015\002skipping report\n'
printf '0009\0010000'
printf '0000'

View File

@ -509,4 +509,20 @@ test_expect_success 'colorize errors/hints' '
test_i18ngrep ! "^hint: " decoded
'
test_expect_success 'report error server does not provide ref status' '
git init "$HTTPD_DOCUMENT_ROOT_PATH/no_report" &&
git -C "$HTTPD_DOCUMENT_ROOT_PATH/no_report" config http.receivepack true &&
test_must_fail git push --porcelain \
$HTTPD_URL_USER_PASS/smart/no_report \
HEAD:refs/tags/will-fail >actual &&
test_must_fail git -C "$HTTPD_DOCUMENT_ROOT_PATH/no_report" \
rev-parse --verify refs/tags/will-fail &&
cat >expect <<-EOF &&
To $HTTPD_URL/smart/no_report
! HEAD:refs/tags/will-fail [remote failure] (remote failed to report status)
Done
EOF
test_cmp expect actual
'
test_done

View File

@ -845,6 +845,10 @@ static int push_update_ref_status(struct strbuf *buf,
forced = 1;
FREE_AND_NULL(msg);
}
else if (!strcmp(msg, "expecting report")) {
status = REF_STATUS_EXPECTING_REPORT;
FREE_AND_NULL(msg);
}
}
if (state->hint)