hook: allow overriding the ungroup option

When calling run_process_parallel() in run_hooks_opt(), the ungroup option is currently hardcoded to .ungroup = 1. This causes problems when ungrouping should be disabled, for example when sideband-reading collated output from child hooks, because sideband-reading and ungrouping are mutually exclusive. Thus a new hook.h option is added to allow overriding. The existing ungroup=1 behavior is preserved in the run_hooks() API and the "hook run" command. We could modify these to take an option if necessary, so I added two code comments there. Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Adrian Ratiu committed Dec 26, 2025 at 14:23 UTC 857f047e40f796aa43c6e7c754d8a32ee64e4f4d
4 files changed +18 -1
builtin/hook.c
+6
@@ -43,6 +43,12 @@ static int run(int argc, const char **argv, const char *prefix,
43 if (!argc)
44 goto usage;
45
46 + /*
47 + * All current "hook run" use-cases require ungrouped child output.
48 + * If this changes, a hook run argument can be added to toggle it.
49 + */
50 + opt.ungroup = 1;
51 +
52 /*
53 * Having a -- for "run" when providing <hook-args> is
54 * mandatory.
commit.c
+3
@@ -1965,6 +1965,9 @@ int run_commit_hook(int editor_is_used, const char *index_file,
1965 strvec_push(&opt.args, arg);
1966 va_end(args);
1967
1968 + /* All commit hook use-cases require ungrouping child output. */
1969 + opt.ungroup = 1;
1970 +
1971 opt.invoked_hook = invoked_hook;
1972 return run_hooks_opt(the_repository, name, &opt);
1973 }
hook.c
+4 -1
@@ -153,7 +153,7 @@ int run_hooks_opt(struct repository *r, const char *hook_name,
153 .tr2_label = hook_name,
154
155 .processes = 1,
156 - .ungroup = 1,
156 + .ungroup = options->ungroup,
157
158 .get_next_task = pick_next_hook,
159 .start_failure = notify_start_failure,
@@ -198,6 +198,9 @@ int run_hooks(struct repository *r, const char *hook_name)
198 {
199 struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
200
201 + /* All use-cases of this API require ungrouping. */
202 + opt.ungroup = 1;
203 +
204 return run_hooks_opt(r, hook_name, &opt);
205 }
206
hook.h
+5
@@ -34,6 +34,11 @@ struct run_hooks_opt
34 */
35 int *invoked_hook;
36
37 + /**
38 + * Allow hooks to set run_processes_parallel() 'ungroup' behavior.
39 + */
40 + unsigned int ungroup:1;
41 +
42 /**
43 * Path to file which should be piped to stdin for each hook.
44 */