Re: [PATCH v3 2/4] remote-curl: send the refs to fetch-pack on stdin
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:53:27
Ivan Todoroski [off-list ref] writes:
quoted hunk
Now that we can throw an arbitrary number of refs at fetch-pack using its --stdin option, we use it in the remote-curl helper to bypass the OS command line length limit. Signed-off-by: Ivan Todoroski <redacted> --- remote-curl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)diff --git a/remote-curl.c b/remote-curl.c index d159fe7f34..a728edfa7f 100644 --- a/remote-curl.c +++ b/remote-curl.c@@ -633,6 +638,7 @@ static int fetch_git(struct discovery *heads, argv = xmalloc((15 + nr_heads) * sizeof(char*));
You no longer need an argv array whose size is proportional to nr_heads. I'll queue the patch without "+ nr_heads" part, but we should probably switch this to use argv_array API after this series settles.
quoted hunk
argv[argc++] = "fetch-pack"; argv[argc++] = "--stateless-rpc"; + argv[argc++] = "--stdin"; argv[argc++] = "--lock-pack"; if (options.followtags) argv[argc++] = "--include-tag";@@ -651,23 +657,27 @@ static int fetch_git(struct discovery *heads, argv[argc++] = depth_arg; } argv[argc++] = url; + argv[argc++] = NULL; + for (i = 0; i < nr_heads; i++) { struct ref *ref = to_fetch[i]; if (!ref->name || !*ref->name) die("cannot fetch by sha1 over smart http"); - argv[argc++] = ref->name; + packet_buf_write(&preamble, "%s\n", ref->name); } - argv[argc++] = NULL; + packet_buf_flush(&preamble);