This will be needed to hide the output of `git commit` when the
sequencer handles an interactive rebase's script.

Signed-off-by: Johannes Schindelin <johannes.schinde...@gmx.de>
---
 run-command.c | 23 +++++++++++++++++++++++
 run-command.h |  1 +
 2 files changed, 24 insertions(+)

diff --git a/run-command.c b/run-command.c
index ca905a9e80..5bb957afdd 100644
--- a/run-command.c
+++ b/run-command.c
@@ -589,6 +589,29 @@ int run_command_v_opt_cd_env(const char **argv, int opt, 
const char *dir, const
        cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
        cmd.dir = dir;
        cmd.env = env;
+
+       if (opt & RUN_HIDE_STDERR_ON_SUCCESS) {
+               struct strbuf buf = STRBUF_INIT;
+               int res;
+
+               cmd.err = -1;
+               if (start_command(&cmd) < 0)
+                       return -1;
+
+               if (strbuf_read(&buf, cmd.err, 0) < 0) {
+                       close(cmd.err);
+                       finish_command(&cmd); /* throw away exit code */
+                       return -1;
+               }
+
+               close(cmd.err);
+               res = finish_command(&cmd);
+               if (res)
+                       fputs(buf.buf, stderr);
+               strbuf_release(&buf);
+               return res;
+       }
+
        return run_command(&cmd);
 }
 
diff --git a/run-command.h b/run-command.h
index dd1c78c28d..65a21ddd4e 100644
--- a/run-command.h
+++ b/run-command.h
@@ -72,6 +72,7 @@ extern int run_hook_ve(const char *const *env, const char 
*name, va_list args);
 #define RUN_SILENT_EXEC_FAILURE 8
 #define RUN_USING_SHELL 16
 #define RUN_CLEAN_ON_EXIT 32
+#define RUN_HIDE_STDERR_ON_SUCCESS 64
 int run_command_v_opt(const char **argv, int opt);
 
 /*
-- 
2.11.0.rc3.windows.1


Reply via email to