Merge branch 'jb/t8008-cleanup' into maint
[git.git] / t / perf / p5550-fetch-tags.sh
bloba5dc39f86af65d6f6b200b95c4f3c66d5f482ec1
1 #!/bin/sh
3 test_description='performance of tag-following with many tags
5 This tests a fairly pathological case, so rather than rely on a real-world
6 case, we will construct our own repository. The situation is roughly as
7 follows.
9 The parent repository has a large number of tags which are disconnected from
10 the rest of history. That makes them candidates for tag-following, but we never
11 actually grab them (and thus they will impact each subsequent fetch).
13 The child repository is a clone of parent, without the tags, and is at least
14 one commit behind the parent (meaning that we will fetch one object and then
15 examine the tags to see if they need followed). Furthermore, it has a large
16 number of packs.
18 The exact values of "large" here are somewhat arbitrary; I picked values that
19 start to show a noticeable performance problem on my machine, but without
20 taking too long to set up and run the tests.
22 . ./perf-lib.sh
24 # make a long nonsense history on branch $1, consisting of $2 commits, each
25 # with a unique file pointing to the blob at $2.
26 create_history () {
27 perl -le '
28 my ($branch, $n, $blob) = @ARGV;
29 for (1..$n) {
30 print "commit refs/heads/$branch";
31 print "committer nobody <nobody@example.com> now";
32 print "data 4";
33 print "foo";
34 print "M 100644 $blob $_";
36 ' "$@" |
37 git fast-import --date-format=now
40 # make a series of tags, one per commit in the revision range given by $@
41 create_tags () {
42 git rev-list "$@" |
43 perl -lne 'print "create refs/tags/$. $_"' |
44 git update-ref --stdin
47 # create $1 nonsense packs, each with a single blob
48 create_packs () {
49 perl -le '
50 my ($n) = @ARGV;
51 for (1..$n) {
52 print "blob";
53 print "data <<EOF";
54 print "$_";
55 print "EOF";
57 ' "$@" |
58 git fast-import &&
60 git cat-file --batch-all-objects --batch-check='%(objectname)' |
61 while read sha1
63 echo $sha1 | git pack-objects .git/objects/pack/pack
64 done
67 test_expect_success 'create parent and child' '
68 git init parent &&
69 git -C parent commit --allow-empty -m base &&
70 git clone parent child &&
71 git -C parent commit --allow-empty -m trigger-fetch
74 test_expect_success 'populate parent tags' '
76 cd parent &&
77 blob=$(echo content | git hash-object -w --stdin) &&
78 create_history cruft 3000 $blob &&
79 create_tags cruft &&
80 git branch -D cruft
84 test_expect_success 'create child packs' '
86 cd child &&
87 git config gc.auto 0 &&
88 git config gc.autopacklimit 0 &&
89 create_packs 500
93 test_perf 'fetch' '
94 # make sure there is something to fetch on each iteration
95 git -C child update-ref -d refs/remotes/origin/master &&
96 git -C child fetch
99 test_done