aboutsummaryrefslogtreecommitdiff
path: root/builtin-fetch--tool.c
diff options
context:
space:
mode:
authorJulian Phillips <jp3@quantumfyre.co.uk>2007-02-13 01:21:39 +0000
committerJunio C Hamano <junkio@cox.net>2007-02-13 21:43:53 -0800
commit46ce8b6d2a88b67a839fb53bfa0b8849215352b5 (patch)
treeb829c4e30dbf58c08518021ad6a6094563acdcfe /builtin-fetch--tool.c
parent86551586da8cba6c06ac04783a656843a4e47f35 (diff)
downloadgit-46ce8b6d2a88b67a839fb53bfa0b8849215352b5.tar.gz
git-46ce8b6d2a88b67a839fb53bfa0b8849215352b5.tar.xz
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>
Diffstat (limited to 'builtin-fetch--tool.c')
-rw-r--r--builtin-fetch--tool.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/builtin-fetch--tool.c b/builtin-fetch--tool.c
index 3090ffea2..48de08d85 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]);