The perf framework lets the user run the test in an arbitrary repo, which makes writing a test for rebase a bit finicky. This one uses a perl script to determine a longest linear segment of history, that is, a range A..B which is completely linear. (For a full clone of git.git, this is the (whole) 'html' branch.) The number of commits that are rebased is capped at 50, however. That is, if A..B is more than 50 commits, it uses B~50..B instead. Having determined a suitable range, it then runs rebase with all combinations of rerere (on/off), -i / noninteractive, and -m / normal. Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- t/perf/p3400-rebase.sh | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 t/perf/p3400-rebase.sh diff --git a/t/perf/p3400-rebase.sh b/t/perf/p3400-rebase.sh new file mode 100755 index 0000000..7155574 --- /dev/null +++ b/t/perf/p3400-rebase.sh @@ -0,0 +1,91 @@ +#!/bin/sh + +test_description="Tests git-rebase performance" + +. ./perf-lib.sh + +test_perf_default_repo + +test_expect_success 'find a long run of linear history' ' + git rev-list --topo-order --parents --all | + perl -e '\''$maxL = 0; $maxcommit = undef; + while (<>) { + chomp; + @parents = split; + $commit = shift @parents; + if ($L{$commit} > $maxL) { + $maxL = $L{$commit}; + $maxcommit = $commit; + } + if (1 == scalar @parents + && $L{$commit} >= $L{$parents[0]}) { + $L{$parents[0]} = $L{$commit}+1; + $C{$parents[0]} = $commit; + } + } + $cur = $maxcommit; + while (defined $C{$cur}) { + $cur = $C{$cur}; + } + if ($maxL > 50) { + $maxL = 50; + } + print "$cur~$maxL\n$cur\n"; + '\'' >rebase-args && + base_rev=$(sed -n 1p rebase-args) && + tip_rev=$(sed -n 2p rebase-args) && + git checkout -f -b work $tip_rev +' + +export base_rev tip_rev + +test_expect_success 'verify linearity' ' + git rev-list --parents $base_rev.. >list && + ! grep "[0-9a-f]+ [0-9a-f]+ [0-9a-f+].*" list +' + +test_expect_success 'disable rerere' ' + git config rerere.enabled false +' + +test_perf 'rebase -f (rerere off)' ' + git rebase -f $base_rev +' + +test_perf 'rebase -m -f (rerere off)' ' + git rebase -m -f $base_rev +' + +test_perf 'rebase -i -f (rerere off)' ' + GIT_EDITOR=: git rebase -i -f $base_rev +' + +test_perf 'rebase -i -m -f (rerere off)' ' + GIT_EDITOR=: git rebase -i -m -f $base_rev +' + +test_expect_success 'enable rerere and prime it' ' + git config rerere.enabled true && + git rebase -f $base_rev && + git rebase -m -f $base_rev && + GIT_EDITOR=: git rebase -i -f $base_rev && + GIT_EDITOR=: git rebase -i -m -f $base_rev +' + +test_perf 'rebase -f (rerere ON)' ' + git rebase -f $base_rev +' + +test_perf 'rebase -m -f (rerere ON)' ' + git rebase -m -f $base_rev +' + +test_perf 'rebase -i -f (rerere ON)' ' + GIT_EDITOR=: git rebase -i -f $base_rev +' + +test_perf 'rebase -i -m -f (rerere ON)' ' + GIT_EDITOR=: git rebase -i -m -f $base_rev +' + +test_done -- 1.7.10.rc0.230.g16d90 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html