remote-curl: supports git-upload-archive service

Add new service (git-upload-archive) support in remote-curl, so we can
support remote archive over HTTP/HTTPS protocols. Differences between
git-upload-archive and other services:

 1. The git-archive program does not expect to see protocol version and
    capabilities when connecting to remote-helper, so do not send them
    in remote-curl for the git-upload-archive service.

 2. We need to detect protocol version by calling discover_refs().
    Fallback to use the git-upload-pack service (which, like
    git-upload-archive, is a read-only operation) to discover protocol
    version.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jiang Xin 2024-01-21 21:15:34 +08:00 committed by Junio C Hamano
parent 4a61faf75d
commit 23b7d59a82
1 changed files with 11 additions and 3 deletions

View File

@ -1447,8 +1447,14 @@ static int stateless_connect(const char *service_name)
* establish a stateless connection, otherwise we need to tell the
* client to fallback to using other transport helper functions to
* complete their request.
*
* The "git-upload-archive" service is a read-only operation. Fallback
* to use "git-upload-pack" service to discover protocol version.
*/
discover = discover_refs(service_name, 0);
if (!strcmp(service_name, "git-upload-archive"))
discover = discover_refs("git-upload-pack", 0);
else
discover = discover_refs(service_name, 0);
if (discover->version != protocol_v2) {
printf("fallback\n");
fflush(stdout);
@ -1486,9 +1492,11 @@ static int stateless_connect(const char *service_name)

/*
* Dump the capability listing that we got from the server earlier
* during the info/refs request.
* during the info/refs request. This does not work with the
* "git-upload-archive" service.
*/
write_or_die(rpc.in, discover->buf, discover->len);
if (strcmp(service_name, "git-upload-archive"))
write_or_die(rpc.in, discover->buf, discover->len);

/* Until we see EOF keep sending POSTs */
while (1) {