|  | #!/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 |