diff --git a/connect.c b/connect.c index 47e39d2a73..1d74c1eda2 100644 --- a/connect.c +++ b/connect.c @@ -517,7 +517,7 @@ static void send_capabilities(int fd_out, struct packet_reader *reader) int get_remote_bundle_uri(int fd_out, struct packet_reader *reader, struct bundle_list *bundles, int stateless_rpc) { - int line_nr = 1; + int line_nr = 1, err = 0; /* Assert bundle-uri support */ ensure_server_supports_v2("bundle-uri"); @@ -536,10 +536,19 @@ int get_remote_bundle_uri(int fd_out, struct packet_reader *reader, const char *line = reader->line; line_nr++; + /* + * Do not parse if an error was encountered, but + * continue draining the response so no stale data + * is left in the reader for subsequent protocol + * exchanges. + */ + if (err) + continue; + if (!bundle_uri_parse_line(bundles, line)) continue; - return error(_("error on bundle-uri response line %d: %s"), + err = error(_("error on bundle-uri response line %d: %s"), line_nr, line); } @@ -554,7 +563,7 @@ int get_remote_bundle_uri(int fd_out, struct packet_reader *reader, check_stateless_delimiter(stateless_rpc, reader, _("expected response end packet after ref listing")); - return 0; + return err; } struct ref **get_remote_refs(int fd_out, struct packet_reader *reader, diff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh index 7a0943bd36..7cc8627e17 100755 --- a/t/t5558-clone-bundle-uri.sh +++ b/t/t5558-clone-bundle-uri.sh @@ -1302,6 +1302,35 @@ test_expect_success 'bundles with newline in target path are rejected' ' test_path_is_missing escape ' +test_expect_success 'bundles advertised with missing URI' ' + git clone --no-local --mirror clone-from \ + "$HTTPD_DOCUMENT_ROOT_PATH/no-uri.git" && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/no-uri.git" config uploadpack.advertiseBundleURIs true && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/no-uri.git" config bundle.version 1 && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/no-uri.git" config bundle.mode all && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/no-uri.git" config bundle.bundle-1.creationToken 1 && + + git -c transfer.bundleURI=true clone \ + "$HTTPD_URL/smart/no-uri.git" target-no-uri 2>err && + test_grep "bundle ${SQ}bundle-1${SQ} has no uri" err && + test_grep ! "expected packfile" err +' + +test_expect_success 'bundles advertised with empty URI' ' + git clone --no-local --mirror clone-from \ + "$HTTPD_DOCUMENT_ROOT_PATH/empty-uri.git" && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/empty-uri.git" config uploadpack.advertiseBundleURIs true && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/empty-uri.git" config bundle.version 1 && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/empty-uri.git" config bundle.mode all && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/empty-uri.git" config bundle.bundle-1.uri "" && + git -C "$HTTPD_DOCUMENT_ROOT_PATH/empty-uri.git" config bundle.bundle-1.creationToken 1 && + + git -c transfer.bundleURI=true clone \ + "$HTTPD_URL/smart/empty-uri.git" target-empty-uri 2>err && + test_grep "bundle ${SQ}bundle-1${SQ} has no uri" err && + test_grep ! "expected packfile" err +' + # Do not add tests here unless they use the HTTP server, as they will # not run unless the HTTP dependencies exist.