| #!/bin/sh |
| |
| test_description='fetch performance with many packs |
| |
| It is common for fetch to consider objects that we might not have, and it is an |
| easy mistake for the code to use a function like `parse_object` that might |
| give the correct _answer_ on such an object, but do so slowly (due to |
| re-scanning the pack directory for lookup failures). |
| |
| The resulting performance drop can be hard to notice in a real repository, but |
| becomes quite large in a repository with a large number of packs. So this |
| test creates a more pathological case, since any mistakes would produce a more |
| noticeable slowdown. |
| ' |
| . ./perf-lib.sh |
| . "$TEST_DIRECTORY"/perf/lib-pack.sh |
| |
| test_expect_success 'create parent and child' ' |
| git init parent && |
| git clone parent child |
| ' |
| |
| |
| test_expect_success 'create refs in the parent' ' |
| ( |
| cd parent && |
| git commit --allow-empty -m foo && |
| head=$(git rev-parse HEAD) && |
| test_seq 1000 | |
| sed "s,.*,update refs/heads/& $head," | |
| $MODERN_GIT update-ref --stdin |
| ) |
| ' |
| |
| test_expect_success 'create many packs in the child' ' |
| ( |
| cd child && |
| setup_many_packs |
| ) |
| ' |
| |
| test_perf 'fetch' ' |
| # start at the same state for each iteration |
| obj=$($MODERN_GIT -C parent rev-parse HEAD) && |
| ( |
| cd child && |
| $MODERN_GIT for-each-ref --format="delete %(refname)" refs/remotes | |
| $MODERN_GIT update-ref --stdin && |
| rm -vf .git/objects/$(echo $obj | sed "s|^..|&/|") && |
| |
| git fetch |
| ) |
| ' |
| |
| test_done |