| #!/bin/sh |
| |
| test_description='performance of tag-following with many tags |
| |
| This tests a fairly pathological case, so rather than rely on a real-world |
| case, we will construct our own repository. The situation is roughly as |
| follows. |
| |
| The parent repository has a large number of tags which are disconnected from |
| the rest of history. That makes them candidates for tag-following, but we never |
| actually grab them (and thus they will impact each subsequent fetch). |
| |
| The child repository is a clone of parent, without the tags, and is at least |
| one commit behind the parent (meaning that we will fetch one object and then |
| examine the tags to see if they need followed). Furthermore, it has a large |
| number of packs. |
| |
| The exact values of "large" here are somewhat arbitrary; I picked values that |
| start to show a noticeable performance problem on my machine, but without |
| taking too long to set up and run the tests. |
| ' |
| . ./perf-lib.sh |
| . "$TEST_DIRECTORY/perf/lib-pack.sh" |
| |
| # make a long nonsense history on branch $1, consisting of $2 commits, each |
| # with a unique file pointing to the blob at $2. |
| create_history () { |
| perl -le ' |
| my ($branch, $n, $blob) = @ARGV; |
| for (1..$n) { |
| print "commit refs/heads/$branch"; |
| print "committer nobody <nobody@example.com> now"; |
| print "data 4"; |
| print "foo"; |
| print "M 100644 $blob $_"; |
| } |
| ' "$@" | |
| git fast-import --date-format=now |
| } |
| |
| # make a series of tags, one per commit in the revision range given by $@ |
| create_tags () { |
| git rev-list "$@" | |
| perl -lne 'print "create refs/tags/$. $_"' | |
| git update-ref --stdin |
| } |
| |
| test_expect_success 'create parent and child' ' |
| git init parent && |
| git -C parent commit --allow-empty -m base && |
| git clone parent child && |
| git -C parent commit --allow-empty -m trigger-fetch |
| ' |
| |
| test_expect_success 'populate parent tags' ' |
| ( |
| cd parent && |
| blob=$(echo content | git hash-object -w --stdin) && |
| create_history cruft 3000 $blob && |
| create_tags cruft && |
| git branch -D cruft |
| ) |
| ' |
| |
| test_expect_success 'create child packs' ' |
| ( |
| cd child && |
| setup_many_packs |
| ) |
| ' |
| |
| test_perf 'fetch' ' |
| # make sure there is something to fetch on each iteration |
| git -C child update-ref -d refs/remotes/origin/master && |
| git -C child fetch |
| ' |
| |
| test_done |