| #!/bin/sh | |
| test_description='reftable write options' | |
| GIT_TEST_DEFAULT_REF_STORAGE_FORMAT=reftable | |
| export GIT_TEST_DEFAULT_REF_STORAGE_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 | |
| . ./test-lib.sh | |
| # Block sizes depend on the actual refs we write, so, for tests | |
| # that check block size, we force the initial branch name to be "master". | |
| init_repo () { | |
| git init --initial-branch master repo | |
| } | |
| test_expect_success 'default write options' ' | |
| test_when_finished "rm -rf repo" && | |
| 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" && | |
| 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" && | |
| init_repo && | |
| ( | |
| cd repo && | |
| test_commit initial && | |
| test_seq -f "update refs/heads/branch-%d HEAD" 200 | | |
| git update-ref --stdin && | |
| 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 | |
| idx: | |
| - length: 103 | |
| restarts: 1 | |
| 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" && | |
| 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 && | |
| test-tool genzeros 500 | tr "\000" "a" >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" && | |
| init_repo && | |
| ( | |
| cd repo && | |
| test_commit initial && | |
| test_seq -f "update refs/heads/branch-%d HEAD" 10 | | |
| git update-ref --stdin && | |
| 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" && | |
| init_repo && | |
| ( | |
| cd repo && | |
| test_commit initial && | |
| test_seq -f "update refs/heads/branch-%d HEAD" 5 | | |
| git update-ref --stdin && | |
| 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 | |
| idx: | |
| - length: 55 | |
| restarts: 2 | |
| 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" && | |
| init_repo && | |
| ( | |
| cd repo && | |
| test_commit initial && | |
| test_seq -f "update refs/heads/branch-%d HEAD" 5 | | |
| git update-ref --stdin && | |
| 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 | |
| idx: | |
| - length: 55 | |
| restarts: 2 | |
| EOF | |
| test-tool dump-reftable -b .git/reftable/*.ref >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'write options can be set up via onbranch condition' ' | |
| test_config_global core.logAllRefUpdates false && | |
| test_when_finished "rm -rf repo" && | |
| init_repo && | |
| ( | |
| cd repo && | |
| test_commit A && | |
| test_commit B && | |
| cat >.git/include <<-\EOF && | |
| [reftable] | |
| blockSize = 123 | |
| EOF | |
| git config includeIf.onbranch:master.path "$(pwd)/.git/include" && | |
| git refs optimize && | |
| test-tool dump-reftable -b .git/reftable/*.ref >stats && | |
| test_grep "block_size: 123" stats | |
| ) | |
| ' | |
| test_done |