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