diff --git a/compat/terminal.c b/compat/terminal.c index d54efa1c5d..66bf4b55d0 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -419,6 +419,55 @@ static int getchar_with_timeout(int timeout) return getchar(); } +static char *shell_prompt(const char *prompt, int echo) +{ + const char *read_input[] = { + /* Note: call 'bash' explicitly, as 'read -s' is bash-specific */ + "bash", "-c", echo ? + "cat >/dev/tty && read -r line /dev/tty && read -r -s line /dev/tty", + NULL + }; + struct child_process child = CHILD_PROCESS_INIT; + static struct strbuf buffer = STRBUF_INIT; + int prompt_len = strlen(prompt), len = -1, code; + + strvec_pushv(&child.args, read_input); + child.in = -1; + child.out = -1; + child.silent_exec_failure = 1; + + if (start_command(&child)) + return NULL; + + if (write_in_full(child.in, prompt, prompt_len) != prompt_len) { + error("could not write to prompt script"); + close(child.in); + goto ret; + } + close(child.in); + + strbuf_reset(&buffer); + len = strbuf_read(&buffer, child.out, 1024); + if (len < 0) { + error("could not read from prompt script"); + goto ret; + } + + strbuf_strip_suffix(&buffer, "\n"); + strbuf_strip_suffix(&buffer, "\r"); + +ret: + close(child.out); + code = finish_command(&child); + if (code) { + error("failed to execute prompt script (exit code %d)", code); + return NULL; + } + + return len < 0 ? NULL : buffer.buf; +} + #endif #ifndef FORCE_TEXT @@ -431,6 +480,15 @@ char *git_terminal_prompt(const char *prompt, int echo) int r; FILE *input_fh, *output_fh; +#ifdef GIT_WINDOWS_NATIVE + + /* try shell_prompt first, fall back to CONIN/OUT if bash is missing */ + char *result = shell_prompt(prompt, echo); + if (result) + return result; + +#endif + input_fh = fopen(INPUT_PATH, "r" FORCE_TEXT); if (!input_fh) return NULL; diff --git a/gpg-interface.c b/gpg-interface.c index 5c824aeb25..ffa3ce0787 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -972,12 +972,9 @@ static int sign_buffer_gpg(struct strbuf *buffer, struct strbuf *signature, struct child_process gpg = CHILD_PROCESS_INIT; int ret; size_t bottom; - const char *cp; - struct strbuf gpg_status = STRBUF_INIT; strvec_pushl(&gpg.args, use_format->program, - "--status-fd=2", "-bsau", signing_key, NULL); @@ -989,23 +986,11 @@ static int sign_buffer_gpg(struct strbuf *buffer, struct strbuf *signature, */ sigchain_push(SIGPIPE, SIG_IGN); ret = pipe_command(&gpg, buffer->buf, buffer->len, - signature, 1024, &gpg_status, 0); + signature, 1024, NULL, 0); sigchain_pop(SIGPIPE); - for (cp = gpg_status.buf; - cp && (cp = strstr(cp, "[GNUPG:] SIG_CREATED ")); - cp++) { - if (cp == gpg_status.buf || cp[-1] == '\n') - break; /* found */ - } - ret |= !cp; - if (ret) { - error(_("gpg failed to sign the data:\n%s"), - gpg_status.len ? gpg_status.buf : "(no gpg output)"); - strbuf_release(&gpg_status); - return -1; - } - strbuf_release(&gpg_status); + if (ret || signature->len == bottom) + return error(_("gpg failed to sign the data")); /* Strip CR from the line endings, in case we are on Windows. */ remove_cr_after(signature, bottom); diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index fa6336edf9..e253b520f2 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -1517,30 +1517,6 @@ test_expect_success GPG \ 'test_config user.signingkey BobTheMouse && test_must_fail git tag -s -m tail tag-gpg-failure' -# try to produce invalid signature -test_expect_success GPG \ - 'git tag -s fails if gpg is misconfigured (bad signature format)' \ - 'test_config gpg.program echo && - test_must_fail git tag -s -m tail tag-gpg-failure' - -# try to produce invalid signature -test_expect_success GPG 'git verifies tag is valid with double signature' ' - git tag -s -m tail tag-gpg-double-sig && - git cat-file tag tag-gpg-double-sig >tag && - othersigheader=$(test_oid othersigheader) && - sed -ne "/^\$/q;p" tag >new-tag && - cat <<-EOM >>new-tag && - $othersigheader -----BEGIN PGP SIGNATURE----- - someinvaliddata - -----END PGP SIGNATURE----- - EOM - sed -e "1,/^tagger/d" tag >>new-tag && - new_tag=$(git hash-object -t tag -w new-tag) && - git update-ref refs/tags/tag-gpg-double-sig $new_tag && - git verify-tag tag-gpg-double-sig && - git fsck -' - # try to sign with bad user.signingkey test_expect_success GPGSM \ 'git tag -s fails if gpgsm is misconfigured (bad key)' \ @@ -1548,13 +1524,6 @@ test_expect_success GPGSM \ test_config gpg.format x509 && test_must_fail git tag -s -m tail tag-gpg-failure' -# try to produce invalid signature -test_expect_success GPGSM \ - 'git tag -s fails if gpgsm is misconfigured (bad signature format)' \ - 'test_config gpg.x509.program echo && - test_config gpg.format x509 && - test_must_fail git tag -s -m tail tag-gpg-failure' - # try to verify without gpg: rm -rf gpghome