Code

t3302-notes-index-expensive: Speed up create_repo()
authorJohan Herland <johan@herland.net>
Fri, 9 Oct 2009 10:22:03 +0000 (12:22 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 20 Oct 2009 02:00:24 +0000 (19:00 -0700)
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>
t/t3302-notes-index-expensive.sh

index 0ef3e959595cbf157eb2be6c037146b66c87e0bc..ee84fc4884676ef683e6b3d2b6ad718dc2817445 100755 (executable)
@@ -16,30 +16,50 @@ test -z "$GIT_NOTES_TIMING_TESTS" && {
 create_repo () {
        number_of_commits=$1
        nr=0
-       parent=
        test -d .git || {
        git init &&
-       tree=$(git write-tree) &&
-       while [ $nr -lt $number_of_commits ]; do
-               test_tick &&
-               commit=$(echo $nr | git commit-tree $tree $parent) ||
-                       return
-               parent="-p $commit"
-               nr=$(($nr+1))
-       done &&
-       git update-ref refs/heads/master $commit &&
-       {
-               GIT_INDEX_FILE=.git/temp; export GIT_INDEX_FILE;
-               git rev-list HEAD | cat -n | sed "s/^[  ][      ]*/ /g" |
-               while read nr sha1; do
-                       blob=$(echo note $nr | git hash-object -w --stdin) &&
-                       echo $sha1 | sed "s/^/0644 $blob 0      /"
-               done | git update-index --index-info &&
-               tree=$(git write-tree) &&
+       (
+               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 &&
-               commit=$(echo notes | git commit-tree $tree) &&
-               git update-ref refs/notes/commits $commit
-       } &&
+               cat <<INPUT_END &&
+commit refs/notes/commits
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+notes
+COMMIT
+
+INPUT_END
+
+               cat note_commit
+       ) |
+       git fast-import --quiet &&
        git config core.notesRef refs/notes/commits
        }
 }
@@ -48,13 +68,13 @@ test_notes () {
        count=$1 &&
        git config core.notesRef refs/notes/commits &&
        git log | grep "^    " > output &&
-       i=1 &&
-       while [ $i -le $count ]; do
-               echo "    $(($count-$i))" &&
-               echo "    note $i" &&
-               i=$(($i+1));
+       i=$count &&
+       while [ $i -gt 0 ]; do
+               echo "    commit #$i" &&
+               echo "    note for commit #$i" &&
+               i=$(($i-1));
        done > expect &&
-       git diff expect output
+       test_cmp expect output
 }
 
 cat > time_notes << \EOF