aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Beyer <s-beyer@gmx.net>2009-01-17 04:02:55 +0100
committerJunio C Hamano <gitster@pobox.com>2009-01-17 17:57:15 -0800
commit14e6298f1215da503f0f65b63e13d674dd781868 (patch)
tree8088ec6e580653a54324a6b253a8dd4747cee036
parentcf94ca8ea98373d6f5e9caaa764eca89b20bfb63 (diff)
downloadgit-14e6298f1215da503f0f65b63e13d674dd781868.tar.gz
git-14e6298f1215da503f0f65b63e13d674dd781868.tar.xz
run_hook(): allow more than 9 hook arguments
This is done using the ALLOC_GROW macro. Signed-off-by: Stephan Beyer <s-beyer@gmx.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--Documentation/technical/api-run-command.txt2
-rw-r--r--run-command.c18
2 files changed, 10 insertions, 10 deletions
diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt
index 13e7b6361..2efe7a40b 100644
--- a/Documentation/technical/api-run-command.txt
+++ b/Documentation/technical/api-run-command.txt
@@ -58,7 +58,7 @@ Functions
The first argument is a pathname to an index file, or NULL
if the hook uses the default index file or no index is needed.
The second argument is the name of the hook.
- The further arguments (up to 9) correspond to the hook arguments.
+ The further arguments correspond to the hook arguments.
The last argument has to be NULL to terminate the arguments list.
If the hook does not exist or is not executable, the return
value will be zero.
diff --git a/run-command.c b/run-command.c
index fc54c07a9..db9ce5920 100644
--- a/run-command.c
+++ b/run-command.c
@@ -346,23 +346,22 @@ int finish_async(struct async *async)
int run_hook(const char *index_file, const char *name, ...)
{
struct child_process hook;
- const char *argv[10], *env[2];
+ const char **argv = NULL, *env[2];
char index[PATH_MAX];
va_list args;
int ret;
- int i;
+ size_t i = 0, alloc = 0;
if (access(git_path("hooks/%s", name), X_OK) < 0)
return 0;
va_start(args, name);
- argv[0] = git_path("hooks/%s", name);
- i = 0;
- do {
- if (++i >= ARRAY_SIZE(argv))
- die("run_hook(): too many arguments");
- argv[i] = va_arg(args, const char *);
- } while (argv[i]);
+ ALLOC_GROW(argv, i + 1, alloc);
+ argv[i++] = git_path("hooks/%s", name);
+ while (argv[i-1]) {
+ ALLOC_GROW(argv, i + 1, alloc);
+ argv[i++] = va_arg(args, const char *);
+ }
va_end(args);
memset(&hook, 0, sizeof(hook));
@@ -377,6 +376,7 @@ int run_hook(const char *index_file, const char *name, ...)
}
ret = start_command(&hook);
+ free(argv);
if (ret) {
warning("Could not spawn %s", argv[0]);
return ret;