You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.8 KiB
188 lines
4.8 KiB
#!/bin/sh |
|
|
|
test_description='exercise basic bitmap functionality' |
|
. ./test-lib.sh |
|
|
|
objpath () { |
|
echo ".git/objects/$(echo "$1" | sed -e 's|\(..\)|\1/|')" |
|
} |
|
|
|
test_expect_success 'setup repo with moderate-sized history' ' |
|
for i in $(test_seq 1 10); do |
|
test_commit $i |
|
done && |
|
git checkout -b other HEAD~5 && |
|
for i in $(test_seq 1 10); do |
|
test_commit side-$i |
|
done && |
|
git checkout master && |
|
blob=$(echo tagged-blob | git hash-object -w --stdin) && |
|
git tag tagged-blob $blob && |
|
git config repack.writebitmaps true && |
|
git config pack.writebitmaphashcache true |
|
' |
|
|
|
test_expect_success 'full repack creates bitmaps' ' |
|
git repack -ad && |
|
ls .git/objects/pack/ | grep bitmap >output && |
|
test_line_count = 1 output |
|
' |
|
|
|
test_expect_success 'rev-list --test-bitmap verifies bitmaps' ' |
|
git rev-list --test-bitmap HEAD |
|
' |
|
|
|
rev_list_tests() { |
|
state=$1 |
|
|
|
test_expect_success "counting commits via bitmap ($state)" ' |
|
git rev-list --count HEAD >expect && |
|
git rev-list --use-bitmap-index --count HEAD >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success "counting partial commits via bitmap ($state)" ' |
|
git rev-list --count HEAD~5..HEAD >expect && |
|
git rev-list --use-bitmap-index --count HEAD~5..HEAD >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success "counting non-linear history ($state)" ' |
|
git rev-list --count other...master >expect && |
|
git rev-list --use-bitmap-index --count other...master >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success "counting commits with limiting ($state)" ' |
|
git rev-list --count HEAD -- 1.t >expect && |
|
git rev-list --use-bitmap-index --count HEAD -- 1.t >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success "enumerate --objects ($state)" ' |
|
git rev-list --objects --use-bitmap-index HEAD >tmp && |
|
cut -d" " -f1 <tmp >tmp2 && |
|
sort <tmp2 >actual && |
|
git rev-list --objects HEAD >tmp && |
|
cut -d" " -f1 <tmp >tmp2 && |
|
sort <tmp2 >expect && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success "bitmap --objects handles non-commit objects ($state)" ' |
|
git rev-list --objects --use-bitmap-index HEAD tagged-blob >actual && |
|
grep $blob actual |
|
' |
|
} |
|
|
|
rev_list_tests 'full bitmap' |
|
|
|
test_expect_success 'clone from bitmapped repository' ' |
|
git clone --no-local --bare . clone.git && |
|
git rev-parse HEAD >expect && |
|
git --git-dir=clone.git rev-parse HEAD >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success 'setup further non-bitmapped commits' ' |
|
for i in $(test_seq 1 10); do |
|
test_commit further-$i |
|
done |
|
' |
|
|
|
rev_list_tests 'partial bitmap' |
|
|
|
test_expect_success 'fetch (partial bitmap)' ' |
|
git --git-dir=clone.git fetch origin master:master && |
|
git rev-parse HEAD >expect && |
|
git --git-dir=clone.git rev-parse HEAD >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success 'incremental repack cannot create bitmaps' ' |
|
test_commit more-1 && |
|
find .git/objects/pack -name "*.bitmap" >expect && |
|
git repack -d && |
|
find .git/objects/pack -name "*.bitmap" >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success 'incremental repack can disable bitmaps' ' |
|
test_commit more-2 && |
|
git repack -d --no-write-bitmap-index |
|
' |
|
|
|
test_expect_success 'full repack, reusing previous bitmaps' ' |
|
git repack -ad && |
|
ls .git/objects/pack/ | grep bitmap >output && |
|
test_line_count = 1 output |
|
' |
|
|
|
test_expect_success 'fetch (full bitmap)' ' |
|
git --git-dir=clone.git fetch origin master:master && |
|
git rev-parse HEAD >expect && |
|
git --git-dir=clone.git rev-parse HEAD >actual && |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success 'create objects for missing-HAVE tests' ' |
|
blob=$(echo "missing have" | git hash-object -w --stdin) && |
|
tree=$(printf "100644 blob $blob\tfile\n" | git mktree) && |
|
parent=$(echo parent | git commit-tree $tree) && |
|
commit=$(echo commit | git commit-tree $tree -p $parent) && |
|
cat >revs <<-EOF |
|
HEAD |
|
^HEAD^ |
|
^$commit |
|
EOF |
|
' |
|
|
|
test_expect_success 'pack with missing blob' ' |
|
rm $(objpath $blob) && |
|
git pack-objects --stdout --revs <revs >/dev/null |
|
' |
|
|
|
test_expect_success 'pack with missing tree' ' |
|
rm $(objpath $tree) && |
|
git pack-objects --stdout --revs <revs >/dev/null |
|
' |
|
|
|
test_expect_success 'pack with missing parent' ' |
|
rm $(objpath $parent) && |
|
git pack-objects --stdout --revs <revs >/dev/null |
|
' |
|
|
|
test_lazy_prereq JGIT ' |
|
type jgit |
|
' |
|
|
|
test_expect_success JGIT 'we can read jgit bitmaps' ' |
|
git clone . compat-jgit && |
|
( |
|
cd compat-jgit && |
|
rm -f .git/objects/pack/*.bitmap && |
|
jgit gc && |
|
git rev-list --test-bitmap HEAD |
|
) |
|
' |
|
|
|
test_expect_success JGIT 'jgit can read our bitmaps' ' |
|
git clone . compat-us && |
|
( |
|
cd compat-us && |
|
git repack -adb && |
|
# jgit gc will barf if it does not like our bitmaps |
|
jgit gc |
|
) |
|
' |
|
|
|
test_expect_success 'splitting packs does not generate bogus bitmaps' ' |
|
test-genrandom foo $((1024 * 1024)) >rand && |
|
git add rand && |
|
git commit -m "commit with big file" && |
|
git -c pack.packSizeLimit=500k repack -adb && |
|
git init --bare no-bitmaps.git && |
|
git -C no-bitmaps.git fetch .. HEAD |
|
' |
|
|
|
test_done
|
|
|