Browse Source

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>
maint
Stephan Beyer 16 years ago committed by Junio C Hamano
parent
commit
14e6298f12
  1. 2
      Documentation/technical/api-run-command.txt
  2. 18
      run-command.c

2
Documentation/technical/api-run-command.txt

@ -58,7 +58,7 @@ Functions
The first argument is a pathname to an index file, or NULL 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. if the hook uses the default index file or no index is needed.
The second argument is the name of the hook. 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. The last argument has to be NULL to terminate the arguments list.
If the hook does not exist or is not executable, the return If the hook does not exist or is not executable, the return
value will be zero. value will be zero.

18
run-command.c

@ -346,23 +346,22 @@ int finish_async(struct async *async)
int run_hook(const char *index_file, const char *name, ...) int run_hook(const char *index_file, const char *name, ...)
{ {
struct child_process hook; struct child_process hook;
const char *argv[10], *env[2]; const char **argv = NULL, *env[2];
char index[PATH_MAX]; char index[PATH_MAX];
va_list args; va_list args;
int ret; int ret;
int i; size_t i = 0, alloc = 0;


if (access(git_path("hooks/%s", name), X_OK) < 0) if (access(git_path("hooks/%s", name), X_OK) < 0)
return 0; return 0;


va_start(args, name); va_start(args, name);
argv[0] = git_path("hooks/%s", name); ALLOC_GROW(argv, i + 1, alloc);
i = 0; argv[i++] = git_path("hooks/%s", name);
do { while (argv[i-1]) {
if (++i >= ARRAY_SIZE(argv)) ALLOC_GROW(argv, i + 1, alloc);
die("run_hook(): too many arguments"); argv[i++] = va_arg(args, const char *);
argv[i] = va_arg(args, const char *); }
} while (argv[i]);
va_end(args); va_end(args);


memset(&hook, 0, sizeof(hook)); memset(&hook, 0, sizeof(hook));
@ -377,6 +376,7 @@ int run_hook(const char *index_file, const char *name, ...)
} }


ret = start_command(&hook); ret = start_command(&hook);
free(argv);
if (ret) { if (ret) {
warning("Could not spawn %s", argv[0]); warning("Could not spawn %s", argv[0]);
return ret; return ret;

Loading…
Cancel
Save