git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] Move run_hook() from builtin-commit.c into run-command.c (libgit)

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 15, 2009, 15:46 UTC
Message-ID
<alpine.DEB.1.00.0901151637590.3586@pacific.mpi-cbg.de>
In-Reply-To
<1232031618-5243-1-git-send-email-s-beyer@gmx.net>
Hi,
On Thu, 15 Jan 2009, Stephan Beyer wrote:
> 	Stripping out a libified version seemed better to me than
> 	copy and paste.
Oh, definitely.
Show 8 quoted lines
> -	ret = start_command(&hook);
> -	if (ret) {
> -		warning("Could not spawn %s", argv[0]);
> -		return ret;
> -	}
> -	ret = finish_command(&hook);
> -	if (ret == -ERR_RUN_COMMAND_WAITPID_SIGNAL)
> -		warning("%s exited due to uncaught signal", argv[0]);

What are the side effects of replacing this with "ret = run_command(&hook);"? This has to be discussed and defended in the commit message.

Show 43 quoted lines
> diff --git a/run-command.c b/run-command.c
> index c90cdc5..602fe85 100644
> --- a/run-command.c
> +++ b/run-command.c
> @@ -342,3 +342,38 @@ int finish_async(struct async *async)
>  #endif
>  	return ret;
>  }
> +
> +int run_hook(const char *index_file, const char *name, ...)
> +{
> +	struct child_process hook;
> +	const char *argv[10], *env[2];
> +	char index[PATH_MAX];
> +	va_list args;
> +	int i;
> +
> +	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]);
> +	va_end(args);
> +
> +	if (access(argv[0], X_OK) < 0)
> +		return 0;
> +
> +	memset(&hook, 0, sizeof(hook));
> +	hook.argv = argv;
> +	hook.no_stdin = 1;
> +	hook.stdout_to_stderr = 1;
> +	if (index_file) {
> +		snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
> +		env[0] = index;
> +		env[1] = NULL;
> +		hook.env = env;
> +	}
> +
> +	return run_command(&hook);
> +}
Lots of improvements possible (I agree; _after_ this patch):
- deuglify the loop,
- use ALLOC_GROW instead of having a fixed size argv,
- use an strbuf for the index file
- checking executability of argv[0] before filling argv,
and possibly others, too.

Ciao, Dscho

Previous: Miklos VajnaNext: Junio C Hamano
Message 5 of 17 in “Move run_hook() from builtin-commit.c into run-command.c (libgit)”
  1. 1/2 Move run_hook() from builtin-commit.c into run-command.c (libgit)Stephan Beyer, Jan 15, 2009
  2. 2/2 api-run-command.txt: talk about run_hook()Stephan Beyer, Jan 15, 2009
  3. Jakub NarebskiJan 15, 2009
  4. Miklos VajnaJan 15, 2009
  5. Johannes SchindelinJan 15, 2009
  6. Junio C HamanoJan 15, 2009
  7. Stephan BeyerJan 16, 2009
  8. 1/5 checkout: don't crash on file checkout before running post-checkout hookStephan Beyer, Jan 16, 2009
  9. 2/5 Move run_hook() from builtin-commit.c into run-command.c (libgit)Stephan Beyer, Jan 16, 2009
  10. 3/5 api-run-command.txt: talk about run_hook()Stephan Beyer, Jan 16, 2009
  11. 4/5 run_hook(): check the executability of the hook before filling argvStephan Beyer, Jan 16, 2009
  12. 5/5 run_hook(): allow more than 9 hook argumentsStephan Beyer, Jan 16, 2009
  13. Johannes SchindelinJan 16, 2009
  14. 5/5 run_hook(): allow more than 9 hook argumentsStephan Beyer, Jan 17, 2009
  15. Junio C HamanoJan 18, 2009
  16. Stephan BeyerJan 18, 2009
  17. Johannes SchindelinJan 16, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.