]> git.ipfire.org Git - thirdparty/git.git/commitdiff
hook: allow separate std[out|err] streams
authorAdrian Ratiu <adrian.ratiu@collabora.com>
Wed, 28 Jan 2026 21:39:21 +0000 (23:39 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 28 Jan 2026 23:47:03 +0000 (15:47 -0800)
The hook API assumes that all hooks merge stdout to stderr.

This assumption is proven wrong by pre-push: some of its users
actually expect separate stdout and stderr streams and merging
them will cause a regression.

Therefore this adds a mechanism to allow pre-push to separate
the streams, which will be used in the next commit.

The mechanism is generic via struct run_hooks_opt just in case
there are any more surprise exceptions like this.

Reported-by: Chris Darroch <chrisd@apache.org>
Suggested-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
hook.c
hook.h

diff --git a/hook.c b/hook.c
index 5ddd7678d18f0d17437ae99d465b64ce8f3ef5c6..fde1f88ce87b0a6aa4a943ca19c1300b501178d7 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -81,7 +81,7 @@ static int pick_next_hook(struct child_process *cp,
                cp->in = -1;
        }
 
-       cp->stdout_to_stderr = 1;
+       cp->stdout_to_stderr = hook_cb->options->stdout_to_stderr;
        cp->trace2_hook_name = hook_cb->hook_name;
        cp->dir = hook_cb->options->dir;
 
diff --git a/hook.h b/hook.h
index 2169d4a6bd3f2eb02e307db6f7b108efce5a494e..2c8a23a569ae66db69e26219a6e44488e4d56a90 100644 (file)
--- a/hook.h
+++ b/hook.h
@@ -34,6 +34,15 @@ struct run_hooks_opt
         */
        int *invoked_hook;
 
+       /**
+        * Send the hook's stdout to stderr.
+        *
+        * This is the default behavior for all hooks except pre-push,
+        * which has separate stdout and stderr streams for backwards
+        * compatibility reasons.
+        */
+       unsigned int stdout_to_stderr:1;
+
        /**
         * Path to file which should be piped to stdin for each hook.
         */
@@ -80,6 +89,7 @@ struct run_hooks_opt
 #define RUN_HOOKS_OPT_INIT { \
        .env = STRVEC_INIT, \
        .args = STRVEC_INIT, \
+       .stdout_to_stderr = 1, \
 }
 
 struct hook_cb_data {