Skip to content

Commit 5d840ee

Browse files
dschovdye
authored andcommitted
Merge branch 'msys2'
2 parents a28c027 + 590ad48 commit 5d840ee

File tree

3 files changed

+61
-38
lines changed

3 files changed

+61
-38
lines changed

compat/terminal.c

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "git-compat-util.h"
1+
#include "cache.h"
22
#include "compat/terminal.h"
33
#include "sigchain.h"
44
#include "strbuf.h"
@@ -193,6 +193,55 @@ static int mingw_getchar(void)
193193
}
194194
#define getchar mingw_getchar
195195

196+
static char *shell_prompt(const char *prompt, int echo)
197+
{
198+
const char *read_input[] = {
199+
/* Note: call 'bash' explicitly, as 'read -s' is bash-specific */
200+
"bash", "-c", echo ?
201+
"cat >/dev/tty && read -r line </dev/tty && echo \"$line\"" :
202+
"cat >/dev/tty && read -r -s line </dev/tty && echo \"$line\" && echo >/dev/tty",
203+
NULL
204+
};
205+
struct child_process child = CHILD_PROCESS_INIT;
206+
static struct strbuf buffer = STRBUF_INIT;
207+
int prompt_len = strlen(prompt), len = -1, code;
208+
209+
child.argv = read_input;
210+
child.in = -1;
211+
child.out = -1;
212+
child.silent_exec_failure = 1;
213+
214+
if (start_command(&child))
215+
return NULL;
216+
217+
if (write_in_full(child.in, prompt, prompt_len) != prompt_len) {
218+
error("could not write to prompt script");
219+
close(child.in);
220+
goto ret;
221+
}
222+
close(child.in);
223+
224+
strbuf_reset(&buffer);
225+
len = strbuf_read(&buffer, child.out, 1024);
226+
if (len < 0) {
227+
error("could not read from prompt script");
228+
goto ret;
229+
}
230+
231+
strbuf_strip_suffix(&buffer, "\n");
232+
strbuf_strip_suffix(&buffer, "\r");
233+
234+
ret:
235+
close(child.out);
236+
code = finish_command(&child);
237+
if (code) {
238+
error("failed to execute prompt script (exit code %d)", code);
239+
return NULL;
240+
}
241+
242+
return len < 0 ? NULL : buffer.buf;
243+
}
244+
196245
#endif
197246

198247
#ifndef FORCE_TEXT
@@ -205,6 +254,15 @@ char *git_terminal_prompt(const char *prompt, int echo)
205254
int r;
206255
FILE *input_fh, *output_fh;
207256

257+
#ifdef GIT_WINDOWS_NATIVE
258+
259+
/* try shell_prompt first, fall back to CONIN/OUT if bash is missing */
260+
char *result = shell_prompt(prompt, echo);
261+
if (result)
262+
return result;
263+
264+
#endif
265+
208266
input_fh = fopen(INPUT_PATH, "r" FORCE_TEXT);
209267
if (!input_fh)
210268
return NULL;

gpg-interface.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,9 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
445445
struct child_process gpg = CHILD_PROCESS_INIT;
446446
int ret;
447447
size_t i, j, bottom;
448-
struct strbuf gpg_status = STRBUF_INIT;
449448

450449
strvec_pushl(&gpg.args,
451450
use_format->program,
452-
"--status-fd=2",
453451
"-bsau", signing_key,
454452
NULL);
455453

@@ -461,12 +459,10 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
461459
*/
462460
sigchain_push(SIGPIPE, SIG_IGN);
463461
ret = pipe_command(&gpg, buffer->buf, buffer->len,
464-
signature, 1024, &gpg_status, 0);
462+
signature, 1024, NULL, 0);
465463
sigchain_pop(SIGPIPE);
466464

467-
ret |= !strstr(gpg_status.buf, "\n[GNUPG:] SIG_CREATED ");
468-
strbuf_release(&gpg_status);
469-
if (ret)
465+
if (ret || signature->len == bottom)
470466
return error(_("gpg failed to sign the data"));
471467

472468
/* Strip CR from the line endings, in case we are on Windows. */

t/t7004-tag.sh

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,44 +1375,13 @@ test_expect_success GPG \
13751375
'test_config user.signingkey BobTheMouse &&
13761376
test_must_fail git tag -s -m tail tag-gpg-failure'
13771377

1378-
# try to produce invalid signature
1379-
test_expect_success GPG \
1380-
'git tag -s fails if gpg is misconfigured (bad signature format)' \
1381-
'test_config gpg.program echo &&
1382-
test_must_fail git tag -s -m tail tag-gpg-failure'
1383-
1384-
# try to produce invalid signature
1385-
test_expect_success GPG 'git verifies tag is valid with double signature' '
1386-
git tag -s -m tail tag-gpg-double-sig &&
1387-
git cat-file tag tag-gpg-double-sig >tag &&
1388-
othersigheader=$(test_oid othersigheader) &&
1389-
sed -ne "/^\$/q;p" tag >new-tag &&
1390-
cat <<-EOM >>new-tag &&
1391-
$othersigheader -----BEGIN PGP SIGNATURE-----
1392-
someinvaliddata
1393-
-----END PGP SIGNATURE-----
1394-
EOM
1395-
sed -e "1,/^tagger/d" tag >>new-tag &&
1396-
new_tag=$(git hash-object -t tag -w new-tag) &&
1397-
git update-ref refs/tags/tag-gpg-double-sig $new_tag &&
1398-
git verify-tag tag-gpg-double-sig &&
1399-
git fsck
1400-
'
1401-
14021378
# try to sign with bad user.signingkey
14031379
test_expect_success GPGSM \
14041380
'git tag -s fails if gpgsm is misconfigured (bad key)' \
14051381
'test_config user.signingkey BobTheMouse &&
14061382
test_config gpg.format x509 &&
14071383
test_must_fail git tag -s -m tail tag-gpg-failure'
14081384

1409-
# try to produce invalid signature
1410-
test_expect_success GPGSM \
1411-
'git tag -s fails if gpgsm is misconfigured (bad signature format)' \
1412-
'test_config gpg.x509.program echo &&
1413-
test_config gpg.format x509 &&
1414-
test_must_fail git tag -s -m tail tag-gpg-failure'
1415-
14161385
# try to verify without gpg:
14171386

14181387
rm -rf gpghome

0 commit comments

Comments
 (0)