From: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> "git archive --remote=<remote>" learned to talk over the smart http (aka stateless) transport. # Changes since v4 1. Change commit messages and order of commits. 2. Split the last commit of v4 into three seperate commits. # range-diff v4...v5 1: da80391037 ! 1: f3fef46c05 transport-helper: no connection restriction in connect_helper @@ Commit message was for transport that supports the ".connect" method. The "connect_helper()" function protected itself from getting called for a transport without the method before calling process_connect_service(), - which did not work with such a transport. + which only worked with the ".connect" method. Later, commit edc9caf7 (transport-helper: introduce stateless-connect, 2018-03-15) added a way for a transport without the ".connect" method - to establish a "stateless" connection in protocol-v2, which - process_connect_service() was taught to handle the "stateless" - connection, making the old safety valve in its caller that insisted - that ".connect" method must be defined too strict, and forgot to loosen - it. + to establish a "stateless" connection in protocol-v2, where + process_connect_service() was taught to handle the ".stateless_connect" + method, making the old protection too strict. But commit edc9caf7 forgot + to adjust this protection accordingly. Remove the restriction in the "connect_helper()" function and give the function "process_connect_service()" the opportunity to establish a @@ Commit message protocol. Helped-by: Junio C Hamano <gitster@xxxxxxxxx> + Helped-by: Linus Arver <linusa@xxxxxxxxxx> Signed-off-by: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> ## transport-helper.c ## -: ---------- > 2: 6be331b22d remote-curl: supports git-upload-archive service -: ---------- > 3: aabc8e1a2a transport-helper: protocol-v2 supports upload-archive 4: a21a80dae9 ! 4: fdab4abb43 archive: support remote archive from stateless transport @@ Metadata Author: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> ## Commit message ## - archive: support remote archive from stateless transport + http-backend: new rpc-service for git-upload-archive - Even though we can establish a stateless connection, we still cannot - archive the remote repository using a stateless HTTP protocol. Try the - following steps to make it work. + Add new rpc-service "upload-archive" in http-backend to add server side + support for remote archive over HTTP/HTTPS protocols. - 1. Add support for "git-upload-archive" service in "http-backend". - - 2. Use the URL ".../info/refs?service=git-upload-pack" to detect the - protocol version, instead of use the "git-upload-archive" service. - - 3. "git-archive" does not expect to see protocol version and - capabilities when connecting to remote-helper, so do not send them - in "remote-curl.c" for the "git-upload-archive" service. + Also add new test cases in t5003. In the test case "archive remote http + repository", git-archive exits with a non-0 exit code even though we + create the archive correctly. It will be fixed in a later commit. Helped-by: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> Signed-off-by: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> if (ret) ... (omitted) ... 3: 870dc5fd21 ! 5: 6ac0c8e105 transport-helper: call do_take_over() in connect_helper @@ Commit message After successfully connecting to the smart transport by calling process_connect_service() in connect_helper(), run do_take_over() to replace the old vtable with a new one which has methods ready for the - smart transport connection. + smart transport connection. This will fix the exit code of git-archive + in test case "archive remote http repository" of t5003. The connect_helper() function is used as the connect method of the vtable in "transport-helper.c", and it is called by transport_connect() @@ Commit message transport_connect() so far is in "builtin/archive.c". Without running do_take_over(), it may fail to call transport_disconnect() in run_remote_archiver() of "builtin/archive.c". This is because for a - stateless connection or a service like "git-upload-pack-archive", the + stateless connection and a service like "git-upload-archive", the remote helper may receive a SIGPIPE signal and exit early. To have a graceful disconnect method by calling do_take_over() will solve this issue. - The subsequent commit will introduce remote archive over a stateless-rpc - connection. - + Helped-by: Linus Arver <linusa@xxxxxxxxxx> Signed-off-by: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> + ## t/t5003-archive-zip.sh ## +@@ t/t5003-archive-zip.sh: test_expect_success 'remote archive does not work with protocol v1' ' + ' + + test_expect_success 'archive remote http repository' ' +- test_must_fail git archive --remote="$HTTPD_URL/auth/smart/bare.git" \ ++ git archive --remote="$HTTPD_URL/auth/smart/bare.git" \ + --output=remote-http.zip HEAD && + test_cmp_bin d.zip remote-http.zip + ' + ## transport-helper.c ## @@ transport-helper.c: static int connect_helper(struct transport *transport, const char *name, 2: 2f7060f7c5 = 6: 423a89c593 transport-helper: call do_take_over() in process_connect Jiang Xin (6): transport-helper: no connection restriction in connect_helper remote-curl: supports git-upload-archive service transport-helper: protocol-v2 supports upload-archive http-backend: new rpc-service for git-upload-archive transport-helper: call do_take_over() in connect_helper transport-helper: call do_take_over() in process_connect http-backend.c | 13 ++++++++++--- remote-curl.c | 14 +++++++++++--- t/t5003-archive-zip.sh | 34 ++++++++++++++++++++++++++++++++++ transport-helper.c | 29 +++++++++++++---------------- 4 files changed, 68 insertions(+), 22 deletions(-) -- 2.43.0