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.
55 lines
1.4 KiB
55 lines
1.4 KiB
#!/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
|
|
|