#!/bin/sh test_description='Tests pack performance using bitmaps' . ./perf-lib.sh test_perf_large_repo # note that we do everything through config, # since we want to be able to compare bitmap-aware # git versus non-bitmap git # # We intentionally use the deprecated pack.writebitmaps # config so that we can test against older versions of git. test_expect_success 'setup bitmap config' ' git config pack.writebitmaps true ' # we need to create the tag up front such that it is covered by the repack and # thus by generated bitmaps. test_expect_success 'create tags' ' git tag --message="tag pointing to HEAD" perf-tag HEAD ' test_perf 'repack to disk' ' git repack -ad ' test_perf 'simulated clone' ' git pack-objects --stdout --all /dev/null ' test_perf 'simulated fetch' ' have=$(git rev-list HEAD~100 -1) && { echo HEAD && echo ^$have } | git pack-objects --revs --stdout >/dev/null ' test_perf 'pack to file (bitmap)' ' git pack-objects --use-bitmap-index --all pack1b /dev/null ' test_perf 'rev-list (commits)' ' git rev-list --all --use-bitmap-index >/dev/null ' test_perf 'rev-list (objects)' ' git rev-list --all --use-bitmap-index --objects >/dev/null ' test_perf 'rev-list with tag negated via --not --all (objects)' ' git rev-list perf-tag --not --all --use-bitmap-index --objects >/dev/null ' test_perf 'rev-list with negative tag (objects)' ' git rev-list HEAD --not perf-tag --use-bitmap-index --objects >/dev/null ' test_perf 'rev-list count with blob:none' ' git rev-list --use-bitmap-index --count --objects --all \ --filter=blob:none >/dev/null ' test_perf 'rev-list count with blob:limit=1k' ' git rev-list --use-bitmap-index --count --objects --all \ --filter=blob:limit=1k >/dev/null ' test_perf 'rev-list count with tree:0' ' git rev-list --use-bitmap-index --count --objects --all \ --filter=tree:0 >/dev/null ' test_perf 'simulated partial clone' ' git pack-objects --stdout --all --filter=blob:none /dev/null ' test_expect_success 'create partial bitmap state' ' # pick a commit to represent the repo tip in the past cutoff=$(git rev-list HEAD~100 -1) && orig_tip=$(git rev-parse HEAD) && # now kill off all of the refs and pretend we had # just the one tip rm -rf .git/logs .git/refs/* .git/packed-refs && git update-ref HEAD $cutoff && # and then repack, which will leave us with a nice # big bitmap pack of the "old" history, and all of # the new history will be loose, as if it had been pushed # up incrementally and exploded via unpack-objects git repack -Ad && # and now restore our original tip, as if the pushes # had happened git update-ref HEAD $orig_tip ' test_perf 'clone (partial bitmap)' ' git pack-objects --stdout --all /dev/null ' test_perf 'pack to file (partial bitmap)' ' git pack-objects --use-bitmap-index --all pack2b /dev/null ' test_perf 'rev-list with tree filter (partial bitmap)' ' git rev-list --use-bitmap-index --count --objects --all \ --filter=tree:0 >/dev/null ' test_done