From: Phillip Wood <phillip.wood123@gmail.com>
To: Adrian Ratiu <adrian.ratiu@collabora.com>,
phillip.wood@dunelm.org.uk, git@vger.kernel.org
Cc: Jeff King <peff@peff.net>,
Emily Shaffer <emilyshaffer@google.com>,
Junio C Hamano <gitster@pobox.com>,
Patrick Steinhardt <ps@pks.im>,
Josh Steadmon <steadmon@google.com>,
Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Subject: Re: [PATCH 0/4] Run hooks in parallel
Date: Fri, 13 Feb 2026 14:39:48 +0000 [thread overview]
Message-ID: <1dd09e04-dbdb-4a6c-933a-e4dc451878f9@gmail.com> (raw)
In-Reply-To: <87jywiox9f.fsf@collabora.com>
On 12/02/2026 14:24, Adrian Ratiu wrote:
> On Thu, 12 Feb 2026, Phillip Wood <phillip.wood123@gmail.com> wrote:
>> Hi Adrian
>>
>> On 04/02/2026 17:33, Adrian Ratiu wrote:
>>> 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.
>>
>> There's quite a lot of prior-art on parallelization from the various
>> hook managers - is there anything we can learn from them? For example I
>> know some of them serialize the pre-commit hook by default as it may
>> update the index but allow the user to configure a subset of scripts
>> that can be parallelized. They also allow for parallelization where
>> different scripts update different files (e.g. code formatters for
>> python and C can run in parallel). We don't need to implement all that
>> now but we should design our config so that we can support it in the future.
>
> Yes, all the prior-art is very useful and it is possible to do
> finer-grained (or lower-level? :-) ) parallelism further with the
> new run-command parallelization design, APIs and config.
>
> Obviously that will require more work and doing careful analysis on each
> hook-by-hook case. I'm just adding the basic buliding blocks and
> enabling the "highest-level" (most... independent?... level between
> tasks) of parallelism here.
>
> My approach to this big problem was to simplify and break it down into
> smaller / easier-to-manage chunks. I'm still splitting up commits and
> untangling logic to ensure each part is done properly (also easier to
> review) and can work independently (no regresions etc) before building
> on top of it.
That sounds sensible and should make it easier to review, so long as we
design the configuration in a way that it can be extended as we add more
features.
> Thank you, and everyone else, so much for all the help and patience.
>
>>> 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.
>>
>> In the past we had a regression report [1] when the pre-commit hook
>> stopped having access to the terminal. I've not been following the hook
>> changes, is this series (or any of your preparatory series) in danger of
>> reintroducing that regression?
>
> Thank you for raising this, it is a very valuable data point!
>
> The preparatory series 100% will not reintroduce it.
>
> This series might reintroduce it, depending how we set the defaults.
>
> By that I mean:
> -j1 will keep all hooks connected to the tty, just like before.
> -jN with N>1 will disconnect the hooks from the tty and their
> outputs will get buffered through run-command's pipes.
>
> The design I followed (which to be transparent is Peff's design, I just
> implemented his ideas :), is the keep the original, serialized behavior
> exactly how it was before, to not introduce any regressions and to also
> keep identical "real-time" performance.
>
> Taking this into account, together with Patrick's feedback on this
> series, I do intend keep the jobs == 1 default for all hooks in v2.
I think that would be safer. If we could opt-in to parallel execution on
a per-hook basis would that be a solution for the "pre-push" hook? Users
who want to keep the current behavior would avoid configuring parallel
execution for that hook.
Thanks
Phillip
>>
>> Thanks for working on this - both config based hooks and parallel
>> execution are really nice improvements.
>
> Thank you for the kind words. :)
next prev parent reply other threads:[~2026-02-13 14:39 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-04 17:33 [PATCH 0/4] Run hooks in parallel Adrian Ratiu
2026-02-04 17:33 ` [PATCH 1/4] config: add a repo_config_get_uint() helper Adrian Ratiu
2026-02-04 17:33 ` [PATCH 2/4] hook: allow parallel hook execution Adrian Ratiu
2026-02-11 12:41 ` Patrick Steinhardt
2026-02-12 12:25 ` Adrian Ratiu
2026-02-04 17:33 ` [PATCH 3/4] hook: introduce extensions.hookStdoutToStderr Adrian Ratiu
2026-02-04 17:33 ` [PATCH 4/4] hook: allow runtime enabling extensions.hookStdoutToStderr Adrian Ratiu
2026-02-12 10:43 ` [PATCH 0/4] Run hooks in parallel Phillip Wood
2026-02-12 14:24 ` Adrian Ratiu
2026-02-13 14:39 ` Phillip Wood [this message]
2026-02-13 17:21 ` Adrian Ratiu
2026-02-22 0:28 ` [PATCH v2 00/10] " Adrian Ratiu
2026-02-22 0:28 ` [PATCH v2 01/10] repository: fix repo_init() memleak due to missing _clear() Adrian Ratiu
2026-02-22 0:28 ` [PATCH v2 02/10] config: add a repo_config_get_uint() helper Adrian Ratiu
2026-02-22 0:28 ` [PATCH v2 03/10] hook: refactor hook_config_cache from strmap to named struct Adrian Ratiu
2026-02-22 0:28 ` [PATCH v2 04/10] hook: parse the hook.jobs config Adrian Ratiu
2026-02-22 0:28 ` [PATCH v2 05/10] hook: allow parallel hook execution Adrian Ratiu
2026-02-22 0:29 ` [PATCH v2 06/10] hook: mark non-parallelizable hooks Adrian Ratiu
2026-02-22 0:29 ` [PATCH v2 07/10] hook: add -j/--jobs option to git hook run Adrian Ratiu
2026-02-22 0:29 ` [PATCH v2 08/10] hook: add per-event jobs config Adrian Ratiu
2026-02-22 0:29 ` [PATCH v2 09/10] hook: introduce extensions.hookStdoutToStderr Adrian Ratiu
2026-02-22 0:29 ` [PATCH v2 10/10] hook: allow runtime enabling extensions.hookStdoutToStderr Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 0/9] Run hooks in parallel Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 1/9] repository: fix repo_init() memleak due to missing _clear() Adrian Ratiu
2026-03-15 4:55 ` Junio C Hamano
2026-03-15 5:05 ` Junio C Hamano
2026-03-09 13:37 ` [PATCH v3 2/9] config: add a repo_config_get_uint() helper Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 3/9] hook: parse the hook.jobs config Adrian Ratiu
2026-03-15 16:13 ` Junio C Hamano
2026-03-09 13:37 ` [PATCH v3 4/9] hook: allow parallel hook execution Adrian Ratiu
2026-03-15 20:46 ` Junio C Hamano
2026-03-18 18:02 ` Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 5/9] hook: mark non-parallelizable hooks Adrian Ratiu
2026-03-15 20:56 ` Junio C Hamano
2026-03-18 18:40 ` Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 6/9] hook: add -j/--jobs option to git hook run Adrian Ratiu
2026-03-15 21:00 ` Junio C Hamano
2026-03-18 19:00 ` Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 7/9] hook: add per-event jobs config Adrian Ratiu
2026-03-16 18:40 ` Junio C Hamano
2026-03-18 19:21 ` Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 8/9] hook: introduce extensions.hookStdoutToStderr Adrian Ratiu
2026-03-16 18:44 ` Junio C Hamano
2026-03-18 19:50 ` Adrian Ratiu
2026-03-09 13:37 ` [PATCH v3 9/9] hook: allow runtime enabling extensions.hookStdoutToStderr Adrian Ratiu
2026-03-20 13:53 ` [PATCH v4 0/9] Run hooks in parallel Adrian Ratiu
2026-03-20 13:53 ` [PATCH v4 1/9] config: add a repo_config_get_uint() helper Adrian Ratiu
2026-03-20 13:53 ` [PATCH v4 2/9] hook: parse the hook.jobs config Adrian Ratiu
2026-03-24 9:07 ` Patrick Steinhardt
2026-03-24 18:59 ` Adrian Ratiu
2026-03-20 13:53 ` [PATCH v4 3/9] hook: allow parallel hook execution Adrian Ratiu
2026-03-24 9:07 ` Patrick Steinhardt
2026-03-20 13:53 ` [PATCH v4 4/9] hook: allow pre-push parallel execution Adrian Ratiu
2026-03-20 13:53 ` [PATCH v4 5/9] hook: mark non-parallelizable hooks Adrian Ratiu
2026-03-20 13:53 ` [PATCH v4 6/9] hook: add -j/--jobs option to git hook run Adrian Ratiu
2026-03-24 9:07 ` Patrick Steinhardt
2026-03-20 13:53 ` [PATCH v4 7/9] hook: add per-event jobs config Adrian Ratiu
2026-03-24 9:08 ` Patrick Steinhardt
2026-03-20 13:53 ` [PATCH v4 8/9] hook: warn when hook.<friendly-name>.jobs is set Adrian Ratiu
2026-03-24 9:08 ` Patrick Steinhardt
2026-03-20 13:53 ` [PATCH v4 9/9] hook: add hook.<event>.enabled switch Adrian Ratiu
2026-03-24 9:08 ` Patrick Steinhardt
2026-03-25 18:43 ` Adrian Ratiu
2026-03-20 17:24 ` [PATCH v4 0/9] Run hooks in parallel Junio C Hamano
2026-03-23 15:07 ` Adrian Ratiu
2026-03-24 9:07 ` Patrick Steinhardt
2026-03-26 10:18 ` [PATCH v5 00/12] " Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 01/12] repository: fix repo_init() memleak due to missing _clear() Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 02/12] config: add a repo_config_get_uint() helper Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 03/12] hook: parse the hook.jobs config Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 04/12] hook: allow parallel hook execution Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 05/12] hook: allow pre-push parallel execution Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 06/12] hook: mark non-parallelizable hooks Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 07/12] hook: add -j/--jobs option to git hook run Adrian Ratiu
2026-03-27 14:46 ` Patrick Steinhardt
2026-03-26 10:18 ` [PATCH v5 08/12] hook: add per-event jobs config Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 09/12] hook: warn when hook.<friendly-name>.jobs is set Adrian Ratiu
2026-03-27 14:46 ` Patrick Steinhardt
2026-03-26 10:18 ` [PATCH v5 10/12] hook: move is_known_hook() to hook.c for wider use Adrian Ratiu
2026-03-27 14:46 ` Patrick Steinhardt
2026-03-27 15:59 ` Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 11/12] hook: add hook.<event>.enabled switch Adrian Ratiu
2026-03-26 10:18 ` [PATCH v5 12/12] hook: allow hook.jobs=-1 to use all available CPU cores Adrian Ratiu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1dd09e04-dbdb-4a6c-933a-e4dc451878f9@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=adrian.ratiu@collabora.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=peff@peff.net \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
--cc=steadmon@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox