bisect: fix output regressions in v2.30.0

When d1bbbe45df (bisect--helper: reimplement `bisect_run` shell
function in C, 2021-09-13) reimplemented parts of "git bisect run" in
C it changed the output we emitted so that:

 - The "running ..." line was now quoted
 - We lost the \n after our output
 - We started saying "bisect found ..." instead of "bisect run success"

Arguably some of this is better now, but as d1bbbe45df did not
advocate for changing the output, let's revert this for now. It'll be
easy to change it back if that's what we'd prefer.

This does not change the one remaining use of "command.buf" to emit
the quoted argument, as that's new in d1bbbe45df.

Some of these cases were not tested for in the tests added in the
preceding commit, I didn't have time to fleshen those out, but a look
at f1de981e8b will show that the other output being adjusted here is
now equivalent to what it was before d1bbbe45df.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
maint
Đoàn Trần Công Danh 2022-11-10 23:36:38 +07:00 committed by Taylor Blau
parent bdd2aa8a8b
commit f37d0bdd42
2 changed files with 19 additions and 16 deletions

View File

@ -1141,17 +1141,17 @@ static int get_first_good(const char *refname UNUSED,
return 1; return 1;
} }


static int do_bisect_run(const char *command) static int do_bisect_run(const char *command, const char *unquoted_cmd)
{ {
struct child_process cmd = CHILD_PROCESS_INIT; struct child_process cmd = CHILD_PROCESS_INIT;


printf(_("running %s\n"), command); printf(_("running %s\n"), unquoted_cmd);
cmd.use_shell = 1; cmd.use_shell = 1;
strvec_push(&cmd.args, command); strvec_push(&cmd.args, command);
return run_command(&cmd); return run_command(&cmd);
} }


static int verify_good(const struct bisect_terms *terms, const char *command) static int verify_good(const struct bisect_terms *terms, const char *command, const char *unquoted_cmd)
{ {
int rc; int rc;
enum bisect_error res; enum bisect_error res;
@ -1171,7 +1171,7 @@ static int verify_good(const struct bisect_terms *terms, const char *command)
if (res != BISECT_OK) if (res != BISECT_OK)
return -1; return -1;


rc = do_bisect_run(command); rc = do_bisect_run(command, unquoted_cmd);


res = bisect_checkout(&current_rev, no_checkout); res = bisect_checkout(&current_rev, no_checkout);
if (res != BISECT_OK) if (res != BISECT_OK)
@ -1184,6 +1184,7 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
{ {
int res = BISECT_OK; int res = BISECT_OK;
struct strbuf command = STRBUF_INIT; struct strbuf command = STRBUF_INIT;
struct strbuf unquoted = STRBUF_INIT;
const char *new_state; const char *new_state;
int temporary_stdout_fd, saved_stdout; int temporary_stdout_fd, saved_stdout;
int is_first_run = 1; int is_first_run = 1;
@ -1197,8 +1198,9 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
} }


sq_quote_argv(&command, argv); sq_quote_argv(&command, argv);
strbuf_join_argv(&unquoted, argc, argv,' ');
while (1) { while (1) {
res = do_bisect_run(command.buf); res = do_bisect_run(command.buf, unquoted.buf);


/* /*
* Exit code 126 and 127 can either come from the shell * Exit code 126 and 127 can either come from the shell
@ -1208,11 +1210,11 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
* missing or non-executable script. * missing or non-executable script.
*/ */
if (is_first_run && (res == 126 || res == 127)) { if (is_first_run && (res == 126 || res == 127)) {
int rc = verify_good(terms, command.buf); int rc = verify_good(terms, command.buf, unquoted.buf);
is_first_run = 0; is_first_run = 0;
if (rc < 0) { if (rc < 0) {
error(_("unable to verify '%s' on good" error(_("unable to verify '%s' on good"
" revision"), command.buf); " revision"), unquoted.buf);
res = BISECT_FAILED; res = BISECT_FAILED;
break; break;
} }
@ -1226,7 +1228,7 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)


if (res < 0 || 128 <= res) { if (res < 0 || 128 <= res) {
error(_("bisect run failed: exit code %d from" error(_("bisect run failed: exit code %d from"
" '%s' is < 0 or >= 128"), res, command.buf); " '%s' is < 0 or >= 128"), res, unquoted.buf);
break; break;
} }


@ -1260,20 +1262,21 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
if (res == BISECT_ONLY_SKIPPED_LEFT) if (res == BISECT_ONLY_SKIPPED_LEFT)
error(_("bisect run cannot continue any more")); error(_("bisect run cannot continue any more"));
else if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE) { else if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE) {
printf(_("bisect run success")); puts(_("bisect run success"));
res = BISECT_OK; res = BISECT_OK;
} else if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) { } else if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
printf(_("bisect found first bad commit")); puts(_("bisect run success"));
res = BISECT_OK; res = BISECT_OK;
} else if (res) { } else if (res) {
error(_("bisect run failed: 'git bisect--helper --bisect-state" error(_("bisect run failed: 'bisect-state %s'"
" %s' exited with error code %d"), new_state, res); " exited with error code %d"), new_state, res);
} else { } else {
continue; continue;
} }
break; break;
} }


strbuf_release(&unquoted);
strbuf_release(&command); strbuf_release(&command);
return res; return res;
} }

View File

@ -285,7 +285,7 @@ test_bisect_run_args () {
test_cmp expect.args actual.args test_cmp expect.args actual.args
} }


test_expect_failure 'git bisect run: args, stdout and stderr with no arguments' " test_expect_success 'git bisect run: args, stdout and stderr with no arguments' "
test_bisect_run_args <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR' test_bisect_run_args <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
EOF_ARGS EOF_ARGS
running ./run.sh running ./run.sh
@ -295,7 +295,7 @@ test_expect_failure 'git bisect run: args, stdout and stderr with no arguments'
EOF_ERR EOF_ERR
" "


test_expect_failure 'git bisect run: args, stdout and stderr: "--" argument' " test_expect_success 'git bisect run: args, stdout and stderr: "--" argument' "
test_bisect_run_args -- <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR' test_bisect_run_args -- <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
<--> <-->
EOF_ARGS EOF_ARGS
@ -306,7 +306,7 @@ test_expect_failure 'git bisect run: args, stdout and stderr: "--" argument' "
EOF_ERR EOF_ERR
" "


test_expect_failure 'git bisect run: args, stdout and stderr: "--log foo --no-log bar" arguments' " test_expect_success 'git bisect run: args, stdout and stderr: "--log foo --no-log bar" arguments' "
test_bisect_run_args --log foo --no-log bar <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR' test_bisect_run_args --log foo --no-log bar <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
<--log> <--log>
<foo> <foo>
@ -320,7 +320,7 @@ test_expect_failure 'git bisect run: args, stdout and stderr: "--log foo --no-lo
EOF_ERR EOF_ERR
" "


test_expect_failure 'git bisect run: args, stdout and stderr: "--bisect-start" argument' " test_expect_success 'git bisect run: args, stdout and stderr: "--bisect-start" argument' "
test_bisect_run_args --bisect-start <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR' test_bisect_run_args --bisect-start <<-'EOF_ARGS' 6<<-EOF_OUT 7<<-'EOF_ERR'
<--bisect-start> <--bisect-start>
EOF_ARGS EOF_ARGS