run_hook(): allow more than 9 hook arguments
authorStephan Beyer <s-beyer@gmx.net>
Sat, 17 Jan 2009 03:02:55 +0000 (04:02 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 18 Jan 2009 01:57:15 +0000 (17:57 -0800)
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>
Documentation/technical/api-run-command.txt
run-command.c

index 13e7b6361b752ddeebfa2a3e9bd4ad2e4ff495af..2efe7a40be641bc2532c139637fe02e534ea1152 100644 (file)
@@ -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.
index fc54c07a932dbefe39ea98e4cfbb4a15d158b70d..db9ce59204aa4292e82ccd0aaf052cf4159cecdf 100644 (file)
@@ -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;