From: Josh Steadmon <steadmon@google.com>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, gitster@pobox.com, me@ttaylorr.com,
newren@gmail.com, avarab@gmail.com, dyroneteng@gmail.com,
Johannes.Schindelin@gmx.de, szeder.dev@gmail.com,
mjcheetham@outlook.com, Derrick Stolee <derrickstolee@github.com>
Subject: Re: [PATCH 1/5] remote-curl: add 'get' capability
Date: Wed, 27 Jul 2022 15:08:50 -0700 [thread overview]
Message-ID: <YuG3cuFEvhL+wKs/@google.com> (raw)
In-Reply-To: <40808e92afb7bcf3e8e9b4b53d5e30b5e17816f8.1658781277.git.gitgitgadget@gmail.com>
On 2022.07.25 20:34, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <derrickstolee@github.com>
>
> A future change will want a way to download a file over HTTP(S) using
> the simplest of download mechanisms. We do not want to assume that the
> server on the other side understands anything about the Git protocol but
> could be a simple static web server.
>
> Create the new 'get' capability for the remote helpers which advertises
> that the 'get' command is avalable. A caller can send a line containing
> 'get <url> <path>' to download the file at <url> into the file at
> <path>.
>
> Signed-off-by: Derrick Stolee <derrickstolee@github.com>
> ---
> Documentation/gitremote-helpers.txt | 9 +++++++
> remote-curl.c | 32 +++++++++++++++++++++++++
> t/t5557-http-get.sh | 37 +++++++++++++++++++++++++++++
> 3 files changed, 78 insertions(+)
> create mode 100755 t/t5557-http-get.sh
>
> diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
> index 6f1e269ae43..ed8da428c98 100644
> --- a/Documentation/gitremote-helpers.txt
> +++ b/Documentation/gitremote-helpers.txt
> @@ -168,6 +168,9 @@ Supported commands: 'list', 'import'.
> Can guarantee that when a clone is requested, the received
> pack is self contained and is connected.
>
> +'get'::
> + Can use the 'get' command to download a file from a given URI.
> +
> If a helper advertises 'connect', Git will use it if possible and
> fall back to another capability if the helper requests so when
> connecting (see the 'connect' command under COMMANDS).
> @@ -418,6 +421,12 @@ Supported if the helper has the "connect" capability.
> +
> Supported if the helper has the "stateless-connect" capability.
>
> +'get' <uri> <path>::
> + Downloads the file from the given `<uri>` to the given `<path>`. If
> + `<path>.temp` exists, then Git assumes that the `.temp` file is a
> + partial download from a previous attempt and will resume the
> + download from that position.
> +
> If a fatal error occurs, the program writes the error message to
> stderr and exits. The caller should expect that a suitable error
> message has been printed if the child closes the connection without
> diff --git a/remote-curl.c b/remote-curl.c
> index b8758757ece..73fbdbddd84 100644
> --- a/remote-curl.c
> +++ b/remote-curl.c
> @@ -1286,6 +1286,33 @@ static void parse_fetch(struct strbuf *buf)
> strbuf_reset(buf);
> }
>
> +static void parse_get(struct strbuf *buf)
> +{
> + struct strbuf url = STRBUF_INIT;
> + struct strbuf path = STRBUF_INIT;
> + const char *p, *space;
> +
> + if (!skip_prefix(buf->buf, "get ", &p))
> + die(_("http transport does not support %s"), buf->buf);
Nit: since we're already calling skip_prefix(...) in cmd_main() below,
can we just pass the suffix to parse_get() and avoid having to skip the
prefix twice?
> +
> + space = strchr(p, ' ');
> +
> + if (!space)
> + die(_("protocol error: expected '<url> <path>', missing space"));
> +
> + strbuf_add(&url, p, space - p);
> + strbuf_addstr(&path, space + 1);
> +
> + if (http_get_file(url.buf, path.buf, NULL))
> + die(_("failed to download file at URL '%s'"), url.buf);
> +
> + strbuf_release(&url);
> + strbuf_release(&path);
> + printf("\n");
> + fflush(stdout);
> + strbuf_reset(buf);
> +}
> +
> static int push_dav(int nr_spec, const char **specs)
> {
> struct child_process child = CHILD_PROCESS_INIT;
> @@ -1564,9 +1591,14 @@ int cmd_main(int argc, const char **argv)
> printf("unsupported\n");
> fflush(stdout);
>
> + } else if (skip_prefix(buf.buf, "get ", &arg)) {
> + parse_get(&buf);
> + fflush(stdout);
> +
> } else if (!strcmp(buf.buf, "capabilities")) {
> printf("stateless-connect\n");
> printf("fetch\n");
> + printf("get\n");
> printf("option\n");
> printf("push\n");
> printf("check-connectivity\n");
> diff --git a/t/t5557-http-get.sh b/t/t5557-http-get.sh
> new file mode 100755
> index 00000000000..50b7dbcf957
> --- /dev/null
> +++ b/t/t5557-http-get.sh
> @@ -0,0 +1,37 @@
> +#!/bin/sh
> +
> +test_description='test downloading a file by URL'
> +
> +. ./test-lib.sh
> +
> +. "$TEST_DIRECTORY"/lib-httpd.sh
> +start_httpd
> +
> +test_expect_success 'get by URL: 404' '
> + url="$HTTPD_URL/none.txt" &&
> + cat >input <<-EOF &&
> + capabilities
> + get $url file1
> + EOF
> +
> + test_must_fail git remote-http $url <input 2>err &&
> + test_path_is_missing file1 &&
> + grep "failed to download file at URL" err &&
> + rm file1.temp
> +'
> +
> +test_expect_success 'get by URL: 200' '
> + echo data >"$HTTPD_DOCUMENT_ROOT_PATH/exists.txt" &&
> +
> + url="$HTTPD_URL/exists.txt" &&
> + cat >input <<-EOF &&
> + capabilities
> + get $url file2
> +
> + EOF
> +
> + GIT_TRACE2_PERF=1 git remote-http $url <input &&
> + test_cmp "$HTTPD_DOCUMENT_ROOT_PATH/exists.txt" file2
> +'
> +
> +test_done
> --
> gitgitgadget
>
next prev parent reply other threads:[~2022-07-27 22:09 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-25 20:34 [PATCH 0/5] Bundle URIs II: git clone --bundle-uri Derrick Stolee via GitGitGadget
2022-07-25 20:34 ` [PATCH 1/5] remote-curl: add 'get' capability Derrick Stolee via GitGitGadget
2022-07-27 22:08 ` Josh Steadmon [this message]
2022-07-27 23:00 ` Ævar Arnfjörð Bjarmason
2022-08-01 13:55 ` Derrick Stolee
2022-08-01 14:39 ` Ævar Arnfjörð Bjarmason
2022-07-25 20:34 ` [PATCH 2/5] bundle-uri: create basic file-copy logic Derrick Stolee via GitGitGadget
2022-07-27 22:09 ` Josh Steadmon
2022-08-01 13:58 ` Derrick Stolee
2022-07-25 20:34 ` [PATCH 3/5] clone: add --bundle-uri option Derrick Stolee via GitGitGadget
2022-07-25 20:34 ` [PATCH 4/5] bundle-uri: add support for http(s):// and file:// Derrick Stolee via GitGitGadget
2022-07-27 22:09 ` Josh Steadmon
2022-08-01 14:00 ` Derrick Stolee
2022-07-25 20:34 ` [PATCH 5/5] clone: --bundle-uri cannot be combined with --depth Derrick Stolee via GitGitGadget
2022-07-27 22:11 ` [PATCH 0/5] Bundle URIs II: git clone --bundle-uri Josh Steadmon
2022-08-01 14:00 ` Derrick Stolee
2022-08-02 12:29 ` [PATCH v2 " Derrick Stolee via GitGitGadget
2022-08-02 12:29 ` [PATCH v2 1/5] remote-curl: add 'get' capability Derrick Stolee via GitGitGadget
2022-08-02 12:29 ` [PATCH v2 2/5] bundle-uri: create basic file-copy logic Derrick Stolee via GitGitGadget
2022-08-02 12:29 ` [PATCH v2 3/5] clone: add --bundle-uri option Derrick Stolee via GitGitGadget
2022-08-02 12:29 ` [PATCH v2 4/5] bundle-uri: add support for http(s):// and file:// Derrick Stolee via GitGitGadget
2022-08-02 21:32 ` Junio C Hamano
2022-08-04 15:34 ` Derrick Stolee
2022-08-04 18:19 ` Junio C Hamano
2022-08-02 12:29 ` [PATCH v2 5/5] clone: --bundle-uri cannot be combined with --depth Derrick Stolee via GitGitGadget
2022-08-09 13:11 ` [PATCH v3 0/5] Bundle URIs II: git clone --bundle-uri Derrick Stolee via GitGitGadget
2022-08-09 13:11 ` [PATCH v3 1/5] remote-curl: add 'get' capability Derrick Stolee via GitGitGadget
2022-08-09 13:11 ` [PATCH v3 2/5] bundle-uri: create basic file-copy logic Derrick Stolee via GitGitGadget
2022-08-09 13:11 ` [PATCH v3 3/5] clone: add --bundle-uri option Derrick Stolee via GitGitGadget
2022-08-22 21:24 ` Junio C Hamano
2022-08-23 14:05 ` Derrick Stolee
2022-08-24 15:46 ` Junio C Hamano
2022-08-09 13:11 ` [PATCH v3 4/5] bundle-uri: add support for http(s):// and file:// Derrick Stolee via GitGitGadget
2022-08-29 4:58 ` Teng Long
2022-08-30 13:33 ` Derrick Stolee
2022-08-09 13:11 ` [PATCH v3 5/5] clone: --bundle-uri cannot be combined with --depth Derrick Stolee via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YuG3cuFEvhL+wKs/@google.com \
--to=steadmon@google.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=avarab@gmail.com \
--cc=derrickstolee@github.com \
--cc=dyroneteng@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=me@ttaylorr.com \
--cc=mjcheetham@outlook.com \
--cc=newren@gmail.com \
--cc=szeder.dev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.