Subject: Re: [PATCH] Introduce core.initHook

From: Junio C Hamano <[email-masked]>
Date: Mon, 24 Mar 2008 13:25:16 -0700

Johannes Schindelin <[email-masked]> writes:

> diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
> index 03a4f0e..e082218 100644
> --- a/Documentation/git-init.txt
> +++ b/Documentation/git-init.txt
> @@ -60,6 +60,9 @@ If you are initializing a non-bare repository, the config variable
>  `receive.guardCurrentBranch` is set to true.  This avoids problems with
>  pushing into the current branch, which does not touch the working tree.
>  
> +If you want to run a specific script everytime git-init was issued, you
> +can set the variable `core.initHook`.

... in your $HOME/.gitconfig, naturally ;-)

I like the general idea, but with a few nits.

The hook might want to differentiate its behaviour based on how git-init
was invoked, don't you think?  E.g. was it because the end user wanted to
create a new repo?  Re-init?  Clone, cvsimport or some other higher level
commands invoked git-init on the user's behalf?).  The higher level ones
could communicate it via environment so we do not have to worry about them
too much (except perhaps in the documentation part to help hook writers),
but at least re-init is something init-db alone would be able to tell the
hook, so either a parameter to the hook or an environment exported to it
would be needed.  The hook can figure out 'shared' and 'bare' by reading
from $GIT_DIR/config itself, but are there other things we may want to
tell the hook?

> +static int config_init_hook(const char *key, const char *value)
> +{
> +	if (!strcmp(key, "core.inithook"))
> +		init_hook = xstrdup(value);
> +	return 0;

The current way to spell this is with git_config_string() to protect
yourself from segfaulting on:

	[core]
        	inithook

> @@ -407,6 +430,9 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
>  		git_config_set("receive.denyNonFastforwards", "true");
>  	}
>  
> +	if (run_init_hook())
> +		return 1;
> +

Hmm.  Exit without a message even under !quiet?

>  	if (!quiet)
>  		printf("%s%s Git repository in %s/\n",
>  		       reinit ? "Reinitialized existing" : "Initialized empty",