mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Jeff King](/assets/img/avatar_default.png)
We have a function to create a bunch of irrelevant packs to measure the expense of reprepare_packed_git(). Let's make that available to other perf scripts. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
79 lines
2.2 KiB
Bash
Executable file
79 lines
2.2 KiB
Bash
Executable file
#!/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
|