rerere forget: grok files containing NUL

Using 'git rerere forget .' after a merge that involved binary files
runs into an infinite loop if the binary file contains a zero byte.
Replace a strchrnul by memchr because the former does not make progress
as soon as the NUL is encountered.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Sixt 2013-04-01 23:36:36 +02:00 committed by Junio C Hamano
parent 15999998fb
commit 53d8afafbb
2 changed files with 16 additions and 2 deletions

View File

@ -284,8 +284,10 @@ static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
strbuf_release(sb);
if (!io->input.len)
return -1;
ep = strchrnul(io->input.buf, '\n');
if (*ep == '\n')
ep = memchr(io->input.buf, '\n', io->input.len);
if (!ep)
ep = io->input.buf + io->input.len;
else if (*ep == '\n')
ep++;
len = ep - io->input.buf;
strbuf_add(sb, io->input.buf, len);

View File

@ -44,9 +44,13 @@ prime_resolve_undo () {
test_expect_success setup '
mkdir fi &&
printf "a\0a" >binary &&
git add binary &&
test_commit initial fi/le first &&
git branch side &&
git branch another &&
printf "a\0b" >binary &&
git add binary &&
test_commit second fi/le second &&
git checkout side &&
test_commit third fi/le third &&
@ -167,4 +171,12 @@ test_expect_success 'rerere and rerere forget (subdirectory)' '
test_cmp expect actual
'
test_expect_success 'rerere forget (binary)' '
git checkout -f side &&
printf "a\0c" >binary &&
git commit -a -m binary &&
test_must_fail git merge second &&
git rerere forget binary
'
test_done