Merge branch 'rj/add-p-typo-reaction'

When the user responds to a prompt given by "git add -p" with an
unsupported command, list of available commands were given, which
was too much if the user knew what they wanted to type but merely
made a typo.  Now the user gets a much shorter error message.

* rj/add-p-typo-reaction:
  add-patch: response to unknown command
  add-patch: do not show UI messages on stderr
This commit is contained in:
Junio C Hamano
2024-05-08 10:18:45 -07:00
2 changed files with 31 additions and 15 deletions

View File

@ -293,10 +293,9 @@ static void err(struct add_p_state *s, const char *fmt, ...)
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
fputs(s->s.error_color, stderr); fputs(s->s.error_color, stdout);
vfprintf(stderr, fmt, args); vprintf(fmt, args);
fputs(s->s.reset_color, stderr); puts(s->s.reset_color);
fputc('\n', stderr);
va_end(args); va_end(args);
} }
@ -1326,7 +1325,7 @@ static int apply_for_checkout(struct add_p_state *s, struct strbuf *diff,
err(s, _("Nothing was applied.\n")); err(s, _("Nothing was applied.\n"));
} else } else
/* As a last resort, show the diff to the user */ /* As a last resort, show the diff to the user */
fwrite(diff->buf, diff->len, 1, stderr); fwrite(diff->buf, diff->len, 1, stdout);
return 0; return 0;
} }
@ -1668,7 +1667,7 @@ soft_increment:
} }
} else if (s->answer.buf[0] == 'p') { } else if (s->answer.buf[0] == 'p') {
rendered_hunk_index = -1; rendered_hunk_index = -1;
} else { } else if (s->answer.buf[0] == '?') {
const char *p = _(help_patch_remainder), *eol = p; const char *p = _(help_patch_remainder), *eol = p;
color_fprintf(stdout, s->s.help_color, "%s", color_fprintf(stdout, s->s.help_color, "%s",
@ -1692,6 +1691,9 @@ soft_increment:
color_fprintf_ln(stdout, s->s.help_color, color_fprintf_ln(stdout, s->s.help_color,
"%.*s", (int)(eol - p), p); "%.*s", (int)(eol - p), p);
} }
} else {
err(s, _("Unknown command '%s' (use '?' for help)"),
s->answer.buf);
} }
} }
@ -1778,9 +1780,9 @@ int run_add_p(struct repository *r, enum add_p_mode mode,
break; break;
if (s.file_diff_nr == 0) if (s.file_diff_nr == 0)
fprintf(stderr, _("No changes.\n")); err(&s, _("No changes."));
else if (binary_count == s.file_diff_nr) else if (binary_count == s.file_diff_nr)
fprintf(stderr, _("Only binary files changed.\n")); err(&s, _("Only binary files changed."));
add_p_state_clear(&s); add_p_state_clear(&s);
return 0; return 0;

View File

@ -8,6 +8,8 @@ TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-terminal.sh . "$TEST_DIRECTORY"/lib-terminal.sh
SP=" "
diff_cmp () { diff_cmp () {
for x for x
do do
@ -45,17 +47,30 @@ test_expect_success 'warn about add.interactive.useBuiltin' '
cat >expect <<-\EOF && cat >expect <<-\EOF &&
warning: the add.interactive.useBuiltin setting has been removed! warning: the add.interactive.useBuiltin setting has been removed!
See its entry in '\''git help config'\'' for details. See its entry in '\''git help config'\'' for details.
No changes.
EOF EOF
echo "No changes." >expect.out &&
for v in = =true =false for v in = =true =false
do do
git -c "add.interactive.useBuiltin$v" add -p >out 2>actual && git -c "add.interactive.useBuiltin$v" add -p >out 2>actual &&
test_must_be_empty out && test_cmp expect.out out &&
test_cmp expect actual || return 1 test_cmp expect actual || return 1
done done
' '
test_expect_success 'unknown command' '
test_when_finished "git reset --hard; rm -f command" &&
echo W >command &&
git add -N command &&
git diff command >expect &&
cat >>expect <<-EOF &&
(1/1) Stage addition [y,n,q,a,d,e,p,?]? Unknown command ${SQ}W${SQ} (use ${SQ}?${SQ} for help)
(1/1) Stage addition [y,n,q,a,d,e,p,?]?$SP
EOF
git add -p -- command <command >actual 2>&1 &&
test_cmp expect actual
'
test_expect_success 'setup (initial)' ' test_expect_success 'setup (initial)' '
echo content >file && echo content >file &&
git add file && git add file &&
@ -232,7 +247,6 @@ test_expect_success 'setup file' '
' '
test_expect_success 'setup patch' ' test_expect_success 'setup patch' '
SP=" " &&
NULL="" && NULL="" &&
cat >patch <<-EOF cat >patch <<-EOF
@@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
@ -335,13 +349,13 @@ test_expect_success 'different prompts for mode change/deleted' '
test_expect_success 'correct message when there is nothing to do' ' test_expect_success 'correct message when there is nothing to do' '
git reset --hard && git reset --hard &&
git add -p 2>err && git add -p >out &&
test_grep "No changes" err && test_grep "No changes" out &&
printf "\\0123" >binary && printf "\\0123" >binary &&
git add binary && git add binary &&
printf "\\0abc" >binary && printf "\\0abc" >binary &&
git add -p 2>err && git add -p >out &&
test_grep "Only binary files changed" err test_grep "Only binary files changed" out
' '
test_expect_success 'setup again' ' test_expect_success 'setup again' '