Emily Shaffer <emilyshaffer@xxxxxxxxxx> writes: > Add a helper to easily determine whether any hooks exist for a given > hook event. > > Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx> > --- > hook.c | 9 +++++++++ > hook.h | 1 + > 2 files changed, 10 insertions(+) Should we consider the last three patches still work-in-progress technology demonstration, or are these meant as a proposal for a new API element as-is? It is perfectly fine if it is the former. I just want to make sure we share a common understanding on the direction in which we want these patches to take us. Here is my take: - For now, a hook/event that is aware of the config-based hook system is supposed to use hook_exists(), while the traditional ones still use find_hook(). We expect more and more will be converted to the former over time. - Invoking hook scripts under the new world order is done by including hook.h and calling run_hooks(), not by driving the run-command API yourself (I count run_hook_ve() as part of the latter) like the traditional code did. We expect more and more will be converted to the former over time. - From the point of view of the end users who have been happily using scripts in $GIT_DIR/hooks, everything will stay the same. hook_exists() will find them (by calling find_hook() as a fallback) and run_hooks() will run them (by relying on hook_list() to include them). I am guessing that the above gives us a high-level description. The new interface needs to be described in hook.h once the series graduates from the technology demonstration state, in order to help others who want to help updating the callsites of traditional hooks to the new API. And the above three-bullet point list is my attempt to figure out what kind of things need to be documented to help them. I am not seeing anything in run_hooks() that consumes input from us over pipe, by the way, without which we cannot do things like the "pre-receive" hooks under the new world order. Are they planned to come in the future, after these "we feed anything they need from the command line and from the enviornment" hooks are dealt with in this first pass? Thanks. > diff --git a/hook.c b/hook.c > index 0dab981681..7c7b922369 100644 > --- a/hook.c > +++ b/hook.c > @@ -111,6 +111,15 @@ struct list_head* hook_list(const struct strbuf* hookname) > return &hook_head; > } > > +int hook_exists(const char *hookname) > +{ > + const char *value = NULL; > + struct strbuf hook_key = STRBUF_INIT; > + strbuf_addf(&hook_key, "hook.%s.command", hookname); > + > + return (!git_config_get_value(hook_key.buf, &value)) || !!find_hook(hookname); > +} > + > int run_hooks(const char *const *env, const struct strbuf *hookname, > const struct strvec *args) > { > diff --git a/hook.h b/hook.h > index d020788a6b..d94511b609 100644 > --- a/hook.h > +++ b/hook.h > @@ -11,6 +11,7 @@ struct hook > }; > > struct list_head* hook_list(const struct strbuf *hookname); > +int hook_exists(const char *hookname); > int run_hooks(const char *const *env, const struct strbuf *hookname, > const struct strvec *args);