Hello everyone,
This enables running hook commands in parallel and is based on the patch
series enabling config hooks [1], which added the ability to run a list
of hooks for each hook event.
For context, hooks used to run sequentially due to hardcoded .jobs == 1
in hook.c, leading to .processes == 1 in run-command.c. We're removing
that restriction for hooks known to be safe to parallelize.
The parallelism enabled here is to run multiple hook commands/scripts
in parallel for a single event, for example the pre-push event might
trigger linters / spell checkers / unit tests to run at the same time.
Another kind of parallelism is to split the hook input to multiple
child processes, running the same command in parallel on subsets of
the hook input. This series does not do that. It might be a future
addition on top of this, since it's kind of a lower-level parallelism.
The pre-push hook is special because it is the only known hook to break
backward compatibility when running in parallel, due to run-command
collating its outputs via a pipe, so I added an extension for it.
Users can opt-in to this extension with a runtime config.
Suggestions for alternative solutions to the extension are welcome.
Again, this is based on the latest v1 config hooks series [1] which
has not yet landed in next or master.
Branch pushed to GitHub containing all dependency patches: [2]
Successful CI run: [3]
Many thanks to all who contributed to this effort up to now, including
Emily, AEvar, Junio, Patrick, Peff and many others.
Thank you,
Adrian
1: https://lore.kernel.org/git/20260204165126.1548805-1-adrian.ratiu@collabora.com/T/#mdb138a39d332f234bc9068b7f4e05b10c400e572 (local)
2: https://github.com/10ne1/git/tree/refs/heads/dev/aratiu/parallel-hooks-v1
3: https://github.com/10ne1/git/actions/runs/21680184456
Adrian Ratiu (3):
config: add a repo_config_get_uint() helper
hook: introduce extensions.hookStdoutToStderr
hook: allow runtime enabling extensions.hookStdoutToStderr
Emily Shaffer (1):
hook: allow parallel hook execution
Documentation/config/extensions.adoc | 15 ++
Documentation/config/hook.adoc | 14 ++
Documentation/git-hook.adoc | 14 +-
builtin/am.c | 10 +-
builtin/checkout.c | 13 +-
builtin/clone.c | 6 +-
builtin/hook.c | 7 +-
builtin/receive-pack.c | 9 +-
builtin/worktree.c | 2 +-
commit.c | 2 +-
config.c | 28 +++
config.h | 13 ++
hook.c | 51 ++++-
hook.h | 20 +-
parse.c | 9 +
parse.h | 1 +
refs.c | 2 +-
repository.c | 1 +
repository.h | 1 +
sequencer.c | 4 +-
setup.c | 17 ++
setup.h | 1 +
t/t1800-hook.sh | 270 ++++++++++++++++++++++++++-
transport.c | 9 +-
24 files changed, 476 insertions(+), 43 deletions(-)
--
2.52.0.732.gb351b5166d.dirty