mirror of
https://github.com/git/git.git
synced 2024-12-02 22:43:44 +08:00
d0b38a27c6
We can mark t0613 as leak-free: $ make test SANITIZE=leak GIT_TEST_PASSING_SANITIZE_LEAK=check GIT_TEST_SANITIZE_LEAK_LOG=true T=t0613-reftable-write-options.sh [...] *** t0613-reftable-write-options.sh *** in GIT_TEST_PASSING_SANITIZE_LEAK=check mode, setting --invert-exit-code for TEST_PASSES_SANITIZE_LEAK != true ok 1 - default write options ok 2 - disabled reflog writes no log blocks ok 3 - many refs results in multiple blocks ok 4 - tiny block size leads to error ok 5 - small block size leads to multiple ref blocks ok 6 - small block size fails with large reflog message ok 7 - block size exceeding maximum supported size ok 8 - restart interval at every single record ok 9 - restart interval exceeding maximum supported interval ok 10 - object index gets written by default with ref index ok 11 - object index can be disabled # passed all 11 test(s) 1..11 # faking up non-zero exit with --invert-exit-code make[2]: *** [Makefile:75: t0613-reftable-write-options.sh] Error 1 Do it. Signed-off-by: Rubén Justo <rjusto@gmail.com> Acked-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
288 lines
6.3 KiB
Bash
Executable File
288 lines
6.3 KiB
Bash
Executable File
#!/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
|