Merge branch 'jg/mergetool'
[gitweb.git] / run-command.c
index 49810a835e8977d8c90a07cc5b965658e87fa0c4..db9ce59204aa4292e82ccd0aaf052cf4159cecdf 100644 (file)
@@ -346,25 +346,24 @@ 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);
 
-       if (access(argv[0], X_OK) < 0)
-               return 0;
-
        memset(&hook, 0, sizeof(hook));
        hook.argv = argv;
        hook.no_stdin = 1;
@@ -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;