rev-list: handle %x00 NUL in user format
The code paths for showing commits in "git log" and "git rev-list --graph" correctly handle embedded NULs by looking only at the resulting strbuf's length, and never treating it as a C string. The code path for regular rev-list, however, used printf("%s"), which resulted in truncated output. This patch uses fwrite instead, like the --graph code path. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7c6eafa35a
commit
9130ac9fe1
@ -147,8 +147,10 @@ static void show_commit(struct commit *commit, void *data)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (revs->commit_format != CMIT_FMT_USERFORMAT ||
|
if (revs->commit_format != CMIT_FMT_USERFORMAT ||
|
||||||
buf.len)
|
buf.len) {
|
||||||
printf("%s%c", buf.buf, info->hdr_termination);
|
fwrite(buf.buf, 1, buf.len, stdout);
|
||||||
|
putchar(info->hdr_termination);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
} else {
|
} else {
|
||||||
|
@ -77,10 +77,6 @@ test_expect_success 'apply binary patch' \
|
|||||||
tree1=`git write-tree` &&
|
tree1=`git write-tree` &&
|
||||||
test "$tree1" = "$tree0"'
|
test "$tree1" = "$tree0"'
|
||||||
|
|
||||||
nul_to_q() {
|
|
||||||
perl -pe 'y/\000/Q/'
|
|
||||||
}
|
|
||||||
|
|
||||||
test_expect_success 'diff --no-index with binary creation' '
|
test_expect_success 'diff --no-index with binary creation' '
|
||||||
echo Q | q_to_nul >binary &&
|
echo Q | q_to_nul >binary &&
|
||||||
(: hide error code from diff, which just indicates differences
|
(: hide error code from diff, which just indicates differences
|
||||||
|
@ -162,6 +162,14 @@ commit 131a310eb913d107dd3c09a65d1651175898735d
|
|||||||
commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
|
commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
test_expect_success '%x00 shows NUL' '
|
||||||
|
echo >expect commit f58db70b055c5718631e5c61528b28b12090cdea &&
|
||||||
|
echo >>expect fooQbar &&
|
||||||
|
git rev-list -1 --format=foo%x00bar HEAD >actual.nul &&
|
||||||
|
nul_to_q <actual.nul >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success '%ad respects --date=' '
|
test_expect_success '%ad respects --date=' '
|
||||||
echo 2005-04-07 >expect.ad-short &&
|
echo 2005-04-07 >expect.ad-short &&
|
||||||
git log -1 --date=short --pretty=tformat:%ad >output.ad-short master &&
|
git log -1 --date=short --pretty=tformat:%ad >output.ad-short master &&
|
||||||
|
@ -248,6 +248,10 @@ test_decode_color () {
|
|||||||
-e 's/.\[m/<RESET>/g'
|
-e 's/.\[m/<RESET>/g'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nul_to_q () {
|
||||||
|
perl -pe 'y/\000/Q/'
|
||||||
|
}
|
||||||
|
|
||||||
q_to_nul () {
|
q_to_nul () {
|
||||||
perl -pe 'y/Q/\000/'
|
perl -pe 'y/Q/\000/'
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user