зеркало из https://github.com/microsoft/git.git
t3302-notes-index-expensive: Speed up create_repo()
Creating repos with 10/100/1000/10000 commits and notes takes a lot of time. However, using git-fast-import to do the job is a lot more efficient than using plumbing commands to do the same. This patch decreases the overall run-time of this test on my machine from ~3 to ~1 minutes. Signed-off-by: Johan Herland <johan@herland.net> Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
a8dd2e7d2b
Коммит
3ed24b6aaf
|
@ -16,30 +16,50 @@ test -z "$GIT_NOTES_TIMING_TESTS" && {
|
||||||
create_repo () {
|
create_repo () {
|
||||||
number_of_commits=$1
|
number_of_commits=$1
|
||||||
nr=0
|
nr=0
|
||||||
parent=
|
|
||||||
test -d .git || {
|
test -d .git || {
|
||||||
git init &&
|
git init &&
|
||||||
tree=$(git write-tree) &&
|
(
|
||||||
while [ $nr -lt $number_of_commits ]; do
|
while [ $nr -lt $number_of_commits ]; do
|
||||||
|
nr=$(($nr+1))
|
||||||
|
mark=$(($nr+$nr))
|
||||||
|
notemark=$(($mark+1))
|
||||||
|
test_tick &&
|
||||||
|
cat <<INPUT_END &&
|
||||||
|
commit refs/heads/master
|
||||||
|
mark :$mark
|
||||||
|
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||||
|
data <<COMMIT
|
||||||
|
commit #$nr
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
M 644 inline file
|
||||||
|
data <<EOF
|
||||||
|
file in commit #$nr
|
||||||
|
EOF
|
||||||
|
|
||||||
|
blob
|
||||||
|
mark :$notemark
|
||||||
|
data <<EOF
|
||||||
|
note for commit #$nr
|
||||||
|
EOF
|
||||||
|
|
||||||
|
INPUT_END
|
||||||
|
|
||||||
|
echo "N :$notemark :$mark" >> note_commit
|
||||||
|
done &&
|
||||||
test_tick &&
|
test_tick &&
|
||||||
commit=$(echo $nr | git commit-tree $tree $parent) ||
|
cat <<INPUT_END &&
|
||||||
return
|
commit refs/notes/commits
|
||||||
parent="-p $commit"
|
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||||
nr=$(($nr+1))
|
data <<COMMIT
|
||||||
done &&
|
notes
|
||||||
git update-ref refs/heads/master $commit &&
|
COMMIT
|
||||||
{
|
|
||||||
GIT_INDEX_FILE=.git/temp; export GIT_INDEX_FILE;
|
INPUT_END
|
||||||
git rev-list HEAD | cat -n | sed "s/^[ ][ ]*/ /g" |
|
|
||||||
while read nr sha1; do
|
cat note_commit
|
||||||
blob=$(echo note $nr | git hash-object -w --stdin) &&
|
) |
|
||||||
echo $sha1 | sed "s/^/0644 $blob 0 /"
|
git fast-import --quiet &&
|
||||||
done | git update-index --index-info &&
|
|
||||||
tree=$(git write-tree) &&
|
|
||||||
test_tick &&
|
|
||||||
commit=$(echo notes | git commit-tree $tree) &&
|
|
||||||
git update-ref refs/notes/commits $commit
|
|
||||||
} &&
|
|
||||||
git config core.notesRef refs/notes/commits
|
git config core.notesRef refs/notes/commits
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,13 +68,13 @@ test_notes () {
|
||||||
count=$1 &&
|
count=$1 &&
|
||||||
git config core.notesRef refs/notes/commits &&
|
git config core.notesRef refs/notes/commits &&
|
||||||
git log | grep "^ " > output &&
|
git log | grep "^ " > output &&
|
||||||
i=1 &&
|
i=$count &&
|
||||||
while [ $i -le $count ]; do
|
while [ $i -gt 0 ]; do
|
||||||
echo " $(($count-$i))" &&
|
echo " commit #$i" &&
|
||||||
echo " note $i" &&
|
echo " note for commit #$i" &&
|
||||||
i=$(($i+1));
|
i=$(($i-1));
|
||||||
done > expect &&
|
done > expect &&
|
||||||
git diff expect output
|
test_cmp expect output
|
||||||
}
|
}
|
||||||
|
|
||||||
cat > time_notes << \EOF
|
cat > time_notes << \EOF
|
||||||
|
|
Загрузка…
Ссылка в новой задаче