| #!/bin/sh |
| |
| test_description="test performance of Git operations using the index" |
| |
| . ./perf-lib.sh |
| |
| test_perf_default_repo |
| |
| SPARSE_CONE=f2/f4 |
| |
| test_expect_success 'setup repo and indexes' ' |
| git reset --hard HEAD && |
| |
| # Remove submodules from the example repo, because our |
| # duplication of the entire repo creates an unlikely data shape. |
| if git config --file .gitmodules --get-regexp "submodule.*.path" >modules |
| then |
| git rm $(awk "{print \$2}" modules) && |
| git commit -m "remove submodules" || return 1 |
| fi && |
| |
| echo bogus >a && |
| cp a b && |
| git add a b && |
| git commit -m "level 0" && |
| BLOB=$(git rev-parse HEAD:a) && |
| OLD_COMMIT=$(git rev-parse HEAD) && |
| OLD_TREE=$(git rev-parse HEAD^{tree}) && |
| |
| for i in $(test_seq 1 3) |
| do |
| cat >in <<-EOF && |
| 100755 blob $BLOB a |
| 040000 tree $OLD_TREE f1 |
| 040000 tree $OLD_TREE f2 |
| 040000 tree $OLD_TREE f3 |
| 040000 tree $OLD_TREE f4 |
| EOF |
| NEW_TREE=$(git mktree <in) && |
| NEW_COMMIT=$(git commit-tree $NEW_TREE -p $OLD_COMMIT -m "level $i") && |
| OLD_TREE=$NEW_TREE && |
| OLD_COMMIT=$NEW_COMMIT || return 1 |
| done && |
| |
| git sparse-checkout init --cone && |
| git sparse-checkout set $SPARSE_CONE && |
| git checkout -b wide $OLD_COMMIT && |
| |
| for l2 in f1 f2 f3 f4 |
| do |
| echo more bogus >>$SPARSE_CONE/$l2/a && |
| git commit -a -m "edit $SPARSE_CONE/$l2/a" || return 1 |
| done && |
| |
| git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . full-v3 && |
| ( |
| cd full-v3 && |
| git sparse-checkout init --cone && |
| git sparse-checkout set $SPARSE_CONE && |
| git config index.version 3 && |
| git update-index --index-version=3 && |
| git checkout HEAD~4 |
| ) && |
| git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . full-v4 && |
| ( |
| cd full-v4 && |
| git sparse-checkout init --cone && |
| git sparse-checkout set $SPARSE_CONE && |
| git config index.version 4 && |
| git update-index --index-version=4 && |
| git checkout HEAD~4 |
| ) && |
| git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . sparse-v3 && |
| ( |
| cd sparse-v3 && |
| git sparse-checkout init --cone --sparse-index && |
| git sparse-checkout set $SPARSE_CONE && |
| git config index.version 3 && |
| git update-index --index-version=3 && |
| git checkout HEAD~4 |
| ) && |
| git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . sparse-v4 && |
| ( |
| cd sparse-v4 && |
| git sparse-checkout init --cone --sparse-index && |
| git sparse-checkout set $SPARSE_CONE && |
| git config index.version 4 && |
| git update-index --index-version=4 && |
| git checkout HEAD~4 |
| ) |
| ' |
| |
| test_perf_on_all () { |
| command="$@" |
| for repo in full-v3 full-v4 \ |
| sparse-v3 sparse-v4 |
| do |
| test_perf "$command ($repo)" " |
| ( |
| cd $repo && |
| echo >>$SPARSE_CONE/a && |
| $command |
| ) |
| " |
| done |
| } |
| |
| test_perf_on_all git status |
| test_perf_on_all git add -A |
| test_perf_on_all git add . |
| test_perf_on_all git commit -a -m A |
| test_perf_on_all git checkout -f - |
| test_perf_on_all git reset |
| test_perf_on_all git reset --hard |
| test_perf_on_all git reset -- does-not-exist |
| test_perf_on_all git diff |
| test_perf_on_all git diff --cached |
| test_perf_on_all git blame $SPARSE_CONE/a |
| test_perf_on_all git blame $SPARSE_CONE/f3/a |
| test_perf_on_all git read-tree -mu HEAD |
| test_perf_on_all git checkout-index -f --all |
| test_perf_on_all git update-index --add --remove $SPARSE_CONE/a |
| |
| test_done |