diff options
author | Julian Phillips <jp3@quantumfyre.co.uk> | 2007-02-13 04:21:39 +0300 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-02-14 08:43:53 +0300 |
commit | 46ce8b6d2a88b67a839fb53bfa0b8849215352b5 (patch) | |
tree | b829c4e30dbf58c08518021ad6a6094563acdcfe | |
parent | 86551586da8cba6c06ac04783a656843a4e47f35 (diff) |
Allow fetch--tool to read from stdin
If the reflist is "-" then read the reflist data from stdin instead,
this will allow the passing of more than 128K of reflist data - which
won't fit in the environment passed by execve.
Signed-off-by: Julian Phillips <julian@quantumfyre.co.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | builtin-fetch--tool.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/builtin-fetch--tool.c b/builtin-fetch--tool.c index 3090ffea20..48de08d858 100644 --- a/builtin-fetch--tool.c +++ b/builtin-fetch--tool.c @@ -2,6 +2,21 @@ #include "refs.h" #include "commit.h" +#define CHUNK_SIZE (1048576) + +static char *get_stdin(void) +{ + char *data = xmalloc(CHUNK_SIZE); + int offset = 0, read = 0; + read = xread(0, data, CHUNK_SIZE); + while (read == CHUNK_SIZE) { + offset += CHUNK_SIZE; + data = xrealloc(data, offset + CHUNK_SIZE); + read = xread(0, data + offset, CHUNK_SIZE); + } + return data; +} + static void show_new(char *type, unsigned char *sha1_new) { fprintf(stderr, " %s: %s\n", type, @@ -461,14 +476,22 @@ int cmd_fetch__tool(int argc, const char **argv, const char *prefix) return result; } if (!strcmp("parse-reflist", argv[1])) { + const char *reflist; if (argc != 3) return error("parse-reflist takes 1 arg"); - return parse_reflist(argv[2]); + reflist = argv[2]; + if (!strcmp(reflist, "-")) + reflist = get_stdin(); + return parse_reflist(reflist); } if (!strcmp("expand-refs-wildcard", argv[1])) { + const char *reflist; if (argc < 4) return error("expand-refs-wildcard takes at least 2 args"); - return expand_refs_wildcard(argv[2], argc - 3, argv + 3); + reflist = argv[2]; + if (!strcmp(reflist, "-")) + reflist = get_stdin(); + return expand_refs_wildcard(reflist, argc - 3, argv + 3); } return error("Unknown subcommand: %s", argv[1]); |