On Tue, May 14, 2019 at 12:23:31AM +0000, brian m. carlson wrote: > There are a variety of situations in which a user may want an error > behavior for multiple hooks other than the default. Add a config option, > hook.<name>.errorBehavior to allow users to customize this behavior on a > per-hook basis. Provide options for the default behavior (exiting > early), executing all hooks and succeeding if all hooks succeed, or > executing all hooks and succeeding if any hook succeeds. Thanks for using that naming scheme. I think if we do move to allowing config-based hooks, the config schemes will mesh together well. > +static int git_default_hook_config(const char *key, const char *value) > +{ > + const char *hook; > + size_t key_len; > + uintptr_t behavior; > + > + key += strlen("hook."); > + if (strip_suffix(key, ".errorbehavior", &key_len)) { There's an undocumented assumption that the caller has confirmed that the key starts with "hook." here. Can we be a little more defensive and do: if (skip_prefix(key, "hook.", &key)) return 0; here (we could even drop the check in git_default_config). Or we could use parse_key(), which is designed for this: if (parse_key(key, "hook", &subsection, &subsection_len, &key) < 0 || !subsection) return 0; if (!strcmp(key, "errorbehavior")) ... > + /* Use -2 as sentinel because failure to exec is -1. */ > + int ret = -2; Maybe this would be simpler to follow by using an enum for the handler return value? Aside from these nits, the code looked sensible to me. -Peff