mergetool: fix running mergetool in sub-directories
[gitweb.git] / run-command.c
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;