From: Junio C Hamano <gitster@pobox.com>
To: Firmin Martin <firminmartin24@gmail.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>
Subject: Re: [PATCH 2/2] builtin: use git_read_line_interactively to prompt
Date: Fri, 14 May 2021 07:51:43 +0900 [thread overview]
Message-ID: <xmqqr1ia8cxs.fsf@gitster.g> (raw)
In-Reply-To: <20210513214152.34792-3-firminmartin24@gmail.com> (Firmin Martin's message of "Thu, 13 May 2021 23:41:52 +0200")
Firmin Martin <firminmartin24@gmail.com> writes:
> diff --git a/builtin/am.c b/builtin/am.c
> index 8355e3566f..32eae4eb2e 100644
> --- a/builtin/am.c
> +++ b/builtin/am.c
> @@ -1643,7 +1643,7 @@ static int do_interactive(struct am_state *state)
> assert(state->msg);
>
> for (;;) {
> - char reply[64];
> + struct strbuf reply = STRBUF_INIT;
If you call this reply_strbuf, and introduce "const char *reply",
and ...
> puts(_("Commit Body is:"));
> puts("--------------------------");
> @@ -1656,17 +1656,17 @@ static int do_interactive(struct am_state *state)
> * input at this point.
> */
> printf(_("Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "));
> - if (!fgets(reply, sizeof(reply), stdin))
> + if (git_read_line_interactively(&reply) == EOF)
> die("unable to read from stdin; aborting");
... assign "reply = reply_strbuf.buf" here, you do not have to
change anything below.
> - if (*reply == 'y' || *reply == 'Y') {
> + if (reply.len && !strncasecmp(reply.buf, "yes", reply.len)) {
And we shouldn't sneak an unrelated change like this into a patch
whose purpose is to allow reading from the standard input instead of
always from "/dev/tty".
As I explained earlier, git_read_line_interactively() is usable only
when we know that the standard input is *not* used for the data we
are operating on and is available to be used for simulating
interactive input. Since "git am -i" never reads the mailbox from
the standard input, the use of the helper here is acceptable.
> diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
> index 1fdb7d9d10..134347eb39 100644
> --- a/builtin/bisect--helper.c
> +++ b/builtin/bisect--helper.c
> @@ -340,7 +340,7 @@ static int decide_next(const struct bisect_terms *terms,
>
> if (missing_good && !missing_bad &&
> !strcmp(current_term, terms->term_good)) {
> - char *yesno;
> + struct strbuf yesno = STRBUF_INIT;
> /*
> * have bad (or new) but not good (or old). We could bisect
> * although this is less optimum.
> @@ -353,8 +353,9 @@ static int decide_next(const struct bisect_terms *terms,
> * translation. The program will only accept English input
> * at this point.
> */
> - yesno = git_prompt(_("Are you sure [Y/n]? "), PROMPT_ECHO);
> - if (starts_with(yesno, "N") || starts_with(yesno, "n"))
> + printf(_("Are you sure [Y/n]? "));
> + git_read_line_interactively(&yesno);
The use of this helper here is also OK as the standard input to "git
bisect" is available for simulating interactive input.
> + if (yesno.len && !strncasecmp(yesno.buf, "no", yesno.len))
> return -1;
> return 0;
> }
It may make sense to have a thin wrapper around this pattern, e.g.
static int ask_yesno(const char *question)
{
struct strbuf answer = STRBUF_INIT;
printf("%s [Y/n]? ", question);
git_read_line_interactively(&answer);
return !(answer.buf[0] == 'N' || answer.buf[0] == 'n');
}
so that the above caller can become
return ask_yesno(_("Are you sure")) ? 0 : -1;
and ...
> - yesno = git_prompt(_("Do you want me to do it for you "
> - "[Y/n]? "), PROMPT_ECHO);
> - res = tolower(*yesno) == 'n' ?
> + printf(_("Do you want me to do it for you [Y/n]? "));
> + git_read_line_interactively(&yesno);
> + res = (yesno.len && strncasecmp(yesno.buf, "no", yesno.len)) ?
> -1 : bisect_start(terms, empty_strvec, 0);
... this caller can become
if (ask_yesno(_("Do you want me to do it for you")))
res = bisect_start(terms, empty_strvec, 0);
else
res = -1;
Thanks.
prev parent reply other threads:[~2021-05-13 22:51 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-13 21:41 [PATCH 0/2] Refactor some prompts Firmin Martin
2021-05-13 21:41 ` [PATCH 1/2] prompt.h: clarify the non-use of git_prompt Firmin Martin
2021-05-13 22:36 ` Junio C Hamano
2021-05-13 23:03 ` Junio C Hamano
2021-05-15 10:12 ` Jeff King
2021-05-13 21:41 ` [PATCH 2/2] builtin: use git_read_line_interactively to prompt Firmin Martin
2021-05-13 22:51 ` Junio C Hamano [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqr1ia8cxs.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=firminmartin24@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.