[PATCH v2] rebase -x: don't print "Executing:" msgs with --quiet

Matheus Tavares
2024-08-16T22:51:31Z

`rebase --exec` doesn't obey --quiet and ends up printing a few messages
about the command being executed:

git rebase HEAD~3 --quiet --exec "printf foo >/dev/null"
Executing: printf foo >/dev/null
Executing: printf foo >/dev/null
Executing: printf foo >/dev/null

Let's fix that.

Reported-by: Lincoln Yuji <lincolnyuji@hotmail.com>
Reported-by: Rodrigo Siqueira <siqueirajordao@riseup.net>
Signed-off-by: Matheus Tavares <matheus.tavb@gmail.com>
---
Changes in v2:
- Applied commit message fixes by Patrick.
- Fixed codestyle.
- Added regression test.
- Also checked "!opt->quiet" before calling term_clear_line() (this
would only print whitspaces, so no direct impact for users, but the
bytes are still there when the output is captured by scripts, like the
test script :)
- Added Lincoln as one of the reporters.

sequencer.c | 13 +++++++------
t/t3400-rebase.sh | 7 +++++++
2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/sequencer.c b/sequencer.c
index 0291920f0b..79d577e676 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -3793,12 +3793,13 @@ static int error_failed_squash(struct repository *r,
return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
}

-static int do_exec(struct repository *r, const char *command_line)
+static int do_exec(struct repository *r, const char *command_line, int quiet)
{
struct child_process cmd = CHILD_PROCESS_INIT;
int dirty, status;

- fprintf(stderr, _("Executing: %s\n"), command_line);
+ if (!quiet)
+ fprintf(stderr, _("Executing: %s\n"), command_line);
cmd.use_shell = 1;
strvec_push(&cmd.args, command_line);
strvec_push(&cmd.env, "GIT_CHERRY_PICK_HELP");
@@ -4902,7 +4903,7 @@ static int pick_one_commit(struct repository *r,
if (item->command == TODO_EDIT) {
struct commit *commit = item->commit;
if (!res) {
- if (!opts->verbose)
+ if (!opts->quiet && !opts->verbose)
term_clear_line();
fprintf(stderr, _("Stopped at %s... %.*s\n"),
short_commit_name(r, commit), item->arg_len, arg);
@@ -4994,7 +4995,7 @@ static int pick_commits(struct repository *r,
NULL, REF_NO_DEREF);

if (item->command == TODO_BREAK) {
- if (!opts->verbose)
+ if (!opts->quiet && !opts->verbose)
term_clear_line();
return stopped_at_head(r);
}
@@ -5010,10 +5011,10 @@ static int pick_commits(struct repository *r,
char *end_of_arg = (char *)(arg + item->arg_len);
int saved = *end_of_arg;

- if (!opts->verbose)
+ if (!opts->quiet && !opts->verbose)
term_clear_line();
*end_of_arg = '\0';
- res = do_exec(r, arg);
+ res = do_exec(r, arg, opts->quiet);
*end_of_arg = saved;

if (res) {
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index ae34bfad60..15b3228c6e 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -235,6 +235,13 @@ test_expect_success 'rebase --merge -q is quiet' '
test_must_be_empty output.out
'

+test_expect_success 'rebase --exec -q is quiet' '
+ git checkout -B quiet topic &&
+ git rebase --exec true -q main >output.out 2>&1 &&
+ test_must_be_empty output.out
+
+'
+
test_expect_success 'Rebase a commit that sprinkles CRs in' '
(
echo "One" &&
--
2.46.0