Refactor prompts using the helper function git_read_line_interactively as done in 08d383f23e (interactive: refactor code asking the user for interactive input, 2020-04-10). Also fix two git_prompt instances, introduced in 09535f056b (bisect--helper: reimplement `bisect_autostart` shell function in C, 2020-09-24). See 97387c8bdd (am: read interactive input from stdin, 2019-05-20) for a detailed motivation to do so. Signed-off-by: Firmin Martin <firminmartin24@xxxxxxxxx> --- builtin/am.c | 14 +++++++------- builtin/bisect--helper.c | 15 ++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) 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; 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"); - if (*reply == 'y' || *reply == 'Y') { + if (reply.len && !strncasecmp(reply.buf, "yes", reply.len)) { return 0; - } else if (*reply == 'a' || *reply == 'A') { + } else if (*reply.buf == 'a' || *reply.buf == 'A') { state->interactive = 0; return 0; - } else if (*reply == 'n' || *reply == 'N') { + } else if (reply.len && !strncasecmp(reply.buf, "no", reply.len)) { return 1; - } else if (*reply == 'e' || *reply == 'E') { + } else if (*reply.buf == 'e' || *reply.buf == 'E') { struct strbuf msg = STRBUF_INIT; if (!launch_editor(am_path(state, "final-commit"), &msg, NULL)) { @@ -1674,7 +1674,7 @@ static int do_interactive(struct am_state *state) state->msg = strbuf_detach(&msg, &state->msg_len); } strbuf_release(&msg); - } else if (*reply == 'v' || *reply == 'V') { + } else if (*reply.buf == 'v' || *reply.buf == 'V') { const char *pager = git_pager(1); struct child_process cp = CHILD_PROCESS_INIT; 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); + if (yesno.len && !strncasecmp(yesno.buf, "no", yesno.len)) return -1; return 0; } @@ -805,7 +806,7 @@ static inline int file_is_not_empty(const char *path) static int bisect_autostart(struct bisect_terms *terms) { int res; - const char *yesno; + struct strbuf yesno = STRBUF_INIT; if (file_is_not_empty(git_path_bisect_start())) return 0; @@ -821,9 +822,9 @@ static int bisect_autostart(struct bisect_terms *terms) * translation. The program will only accept English input * at this point. */ - 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); return res; -- 2.31.1.443.g67a420f573