#!/bin/sh
test_description='reftable write options'
GIT_TEST_DEFAULT_REF_FORMAT=reftable
export GIT_TEST_DEFAULT_REF_FORMAT
# Disable auto-compaction for all tests as we explicitly control repacking of
# refs.
GIT_TEST_REFTABLE_AUTOCOMPACTION=false
export GIT_TEST_REFTABLE_AUTOCOMPACTION
# Block sizes depend on the hash function, so we force SHA1 here.
GIT_TEST_DEFAULT_HASH=sha1
export GIT_TEST_DEFAULT_HASH
# Block sizes also depend on the actual refs we write, so we force "master" to
# be the default initial branch name.
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
test_expect_success 'default write options' '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
git pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 4096
ref:
- length: 129
restarts: 2
log:
- length: 262
restarts: 2
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_expect_success 'disabled reflog writes no log blocks' '
test_config_global core.logAllRefUpdates false &&
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
git pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 4096
ref:
- length: 129
restarts: 2
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_expect_success 'many refs results in multiple blocks' '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
for i in $(test_seq 200)
do
printf "update refs/heads/branch-%d HEAD\n" "$i" ||
return 1
done >input &&
git update-ref --stdin <input &&
git pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 4096
ref:
- length: 4049
restarts: 11
- length: 1136
restarts: 3
log:
- length: 4041
restarts: 4
- length: 4015
restarts: 3
- length: 4014
restarts: 3
- length: 4012
restarts: 3
- length: 3289
restarts: 3
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_expect_success 'tiny block size leads to error' '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
cat >expect <<-EOF &&
error: unable to compact stack: entry too large
EOF
test_must_fail git -c reftable.blockSize=50 pack-refs 2>err &&
test_cmp expect err
)
'
test_expect_success 'small block size leads to multiple ref blocks' '
test_config_global core.logAllRefUpdates false &&
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit A &&
test_commit B &&
git -c reftable.blockSize=100 pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 100
ref:
- length: 53
restarts: 1
- length: 74
restarts: 1
- length: 38
restarts: 1
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_expect_success 'small block size fails with large reflog message' '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit A &&
perl -e "print \"a\" x 500" >logmsg &&
cat >expect <<-EOF &&
fatal: update_ref failed for ref ${SQ}refs/heads/logme${SQ}: reftable: transaction failure: entry too large
EOF
test_must_fail git -c reftable.blockSize=100 \
update-ref -m "$(cat logmsg)" refs/heads/logme HEAD 2>err &&
test_cmp expect err
)
'
test_expect_success 'block size exceeding maximum supported size' '
test_config_global core.logAllRefUpdates false &&
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit A &&
test_commit B &&
cat >expect <<-EOF &&
fatal: reftable block size cannot exceed 16MB
EOF
test_must_fail git -c reftable.blockSize=16777216 pack-refs 2>err &&
test_cmp expect err
)
'
test_expect_success 'restart interval at every single record' '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
for i in $(test_seq 10)
do
printf "update refs/heads/branch-%d HEAD\n" "$i" ||
return 1
done >input &&
git update-ref --stdin <input &&
git -c reftable.restartInterval=1 pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 4096
ref:
- length: 566
restarts: 13
log:
- length: 1393
restarts: 12
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_expect_success 'restart interval exceeding maximum supported interval' '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
cat >expect <<-EOF &&
fatal: reftable block size cannot exceed 65535
EOF
test_must_fail git -c reftable.restartInterval=65536 pack-refs 2>err &&
test_cmp expect err
)
'
test_expect_success 'object index gets written by default with ref index' '
test_config_global core.logAllRefUpdates false &&
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
for i in $(test_seq 5)
do
printf "update refs/heads/branch-%d HEAD\n" "$i" ||
return 1
done >input &&
git update-ref --stdin <input &&
git -c reftable.blockSize=100 pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 100
ref:
- length: 53
restarts: 1
- length: 95
restarts: 1
- length: 71
restarts: 1
- length: 80
restarts: 1
obj:
- length: 11
restarts: 1
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_expect_success 'object index can be disabled' '
test_config_global core.logAllRefUpdates false &&
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
test_commit initial &&
for i in $(test_seq 5)
do
printf "update refs/heads/branch-%d HEAD\n" "$i" ||
return 1
done >input &&
git update-ref --stdin <input &&
git -c reftable.blockSize=100 -c reftable.indexObjects=false pack-refs &&
cat >expect <<-EOF &&
header:
block_size: 100
ref:
- length: 53
restarts: 1
- length: 95
restarts: 1
- length: 71
restarts: 1
- length: 80
restarts: 1
EOF
test-tool dump-reftable -b .git/reftable/*.ref >actual &&
test_cmp expect actual
)
'
test_done