зеркало из https://github.com/microsoft/git.git
Merge branch 'msys2'
This commit is contained in:
Коммит
287aa63dcd
|
@ -418,6 +418,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 && echo \"$line\"" :
|
||||
"cat >/dev/tty && read -r -s line </dev/tty && echo \"$line\" && echo >/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
|
||||
|
@ -430,6 +479,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;
|
||||
|
|
|
@ -950,12 +950,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);
|
||||
|
||||
|
@ -967,23 +964,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);
|
||||
|
|
|
@ -1375,30 +1375,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)' \
|
||||
|
@ -1406,13 +1382,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
|
||||
|
|
Загрузка…
Ссылка в новой задаче