Merge branch 'jk/for-each-reflog-ent-reverse'
The code that reads the reflog from the newer to the older entries did not handle an entry that crosses a boundary of block it uses to read them correctly. * jk/for-each-reflog-ent-reverse: for_each_reflog_ent_reverse: turn leftover check into assertion for_each_reflog_ent_reverse: fix newlines on block boundaries
This commit is contained in:
@ -287,4 +287,34 @@ test_expect_success 'stale dirs do not cause d/f conflicts (reflogs off)' '
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
# Triggering the bug detected by this test requires a newline to fall
|
||||
# exactly BUFSIZ-1 bytes from the end of the file. We don't know
|
||||
# what that value is, since it's platform dependent. However, if
|
||||
# we choose some value N, we also catch any D which divides N evenly
|
||||
# (since we will read backwards in chunks of D). So we choose 8K,
|
||||
# which catches glibc (with an 8K BUFSIZ) and *BSD (1K).
|
||||
#
|
||||
# Each line is 114 characters, so we need 75 to still have a few before the
|
||||
# last 8K. The 89-character padding on the final entry lines up our
|
||||
# newline exactly.
|
||||
test_expect_success 'parsing reverse reflogs at BUFSIZ boundaries' '
|
||||
git checkout -b reflogskip &&
|
||||
z38=00000000000000000000000000000000000000 &&
|
||||
ident="abc <xyz> 0000000001 +0000" &&
|
||||
for i in $(test_seq 1 75); do
|
||||
printf "$z38%02d $z38%02d %s\t" $i $(($i+1)) "$ident" &&
|
||||
if test $i = 75; then
|
||||
for j in $(test_seq 1 89); do
|
||||
printf X
|
||||
done
|
||||
else
|
||||
printf X
|
||||
fi &&
|
||||
printf "\n"
|
||||
done >.git/logs/refs/heads/reflogskip &&
|
||||
git rev-parse reflogskip@{73} >actual &&
|
||||
echo ${z38}03 >expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Reference in New Issue
Block a user