diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-09-19 11:38:31 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-09-19 11:38:31 -0700 |
commit | d9dd4cebec3107545b4354a198ecbc5a141f3f46 (patch) | |
tree | 49ee55d74f5347393359b2e4335309304268388b /builtin | |
parent | 30d45f798d1a4b14759cd977b68be4476d66ea17 (diff) | |
parent | 26be19ba8d8d2e7e3e288b395e7156d5b7af5140 (diff) | |
download | git-d9dd4cebec3107545b4354a198ecbc5a141f3f46.tar.gz |
Merge branch 'jk/send-pack-many-refspecs'
The number of refs that can be pushed at once over smart HTTP was
limited by the command line length. The limitation has been lifted
by passing these refs from the standard input of send-pack.
* jk/send-pack-many-refspecs:
send-pack: take refspecs over stdin
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/send-pack.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/builtin/send-pack.c b/builtin/send-pack.c index f420b74665..4b1bc0fef7 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -110,6 +110,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) int flags; unsigned int reject_reasons; int progress = -1; + int from_stdin = 0; struct push_cas_option cas = {0}; argv++; @@ -169,6 +170,10 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) args.stateless_rpc = 1; continue; } + if (!strcmp(arg, "--stdin")) { + from_stdin = 1; + continue; + } if (!strcmp(arg, "--helper-status")) { helper_status = 1; continue; @@ -201,6 +206,28 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) } if (!dest) usage(send_pack_usage); + + if (from_stdin) { + struct argv_array all_refspecs = ARGV_ARRAY_INIT; + + for (i = 0; i < nr_refspecs; i++) + argv_array_push(&all_refspecs, refspecs[i]); + + if (args.stateless_rpc) { + const char *buf; + while ((buf = packet_read_line(0, NULL))) + argv_array_push(&all_refspecs, buf); + } else { + struct strbuf line = STRBUF_INIT; + while (strbuf_getline(&line, stdin, '\n') != EOF) + argv_array_push(&all_refspecs, line.buf); + strbuf_release(&line); + } + + refspecs = all_refspecs.argv; + nr_refspecs = all_refspecs.argc; + } + /* * --all and --mirror are incompatible; neither makes sense * with any refspecs. |