On Fri, Jun 28 2019, Jeff King wrote: > Some tests need to create a string of commits. Doing this with > test_commit is very heavy-weight, as it needs at least one process per > commit (and in fact, uses several). > > For bulk creation, we can do much better by using fast-import, but it's > often a pain to generate the input. Let's provide a helper to do so. > > We'll use t5310 as a guinea pig, as it has three 10-commit loops. Here > are hyperfine results before and after: > > [before] > Benchmark #1: ./t5310-pack-bitmaps.sh --root=/var/ram/git-tests > Time (mean ± σ): 2.846 s ± 0.305 s [User: 3.042 s, System: 0.919 s] > Range (min … max): 2.250 s … 3.210 s 10 runs > > [after] > Benchmark #1: ./t5310-pack-bitmaps.sh --root=/var/ram/git-tests > Time (mean ± σ): 2.210 s ± 0.174 s [User: 2.570 s, System: 0.604 s] > Range (min … max): 1.999 s … 2.590 s 10 runs > > So we're over 20% faster, while making the callers slightly shorter. We > added a lot more lines in test-lib-function.sh, of course, and the > helper is way more featureful than we need here. But my hope is that it > will be flexible enough to use in more places. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > t/t5310-pack-bitmaps.sh | 15 +---- > t/test-lib-functions.sh | 131 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 134 insertions(+), 12 deletions(-) > > diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh > index a26c8ba9a2..3aab7024ca 100755 > --- a/t/t5310-pack-bitmaps.sh > +++ b/t/t5310-pack-bitmaps.sh > @@ -21,15 +21,9 @@ has_any () { > } > > test_expect_success 'setup repo with moderate-sized history' ' > - for i in $(test_seq 1 10) > - do > - test_commit $i > - done && > + test_commit_bulk --id=file 10 && > git checkout -b other HEAD~5 && > - for i in $(test_seq 1 10) > - do > - test_commit side-$i > - done && > + test_commit_bulk --id=side 10 && > git checkout master && > bitmaptip=$(git rev-parse master) && > blob=$(echo tagged-blob | git hash-object -w --stdin) && > @@ -106,10 +100,7 @@ test_expect_success 'clone from bitmapped repository' ' > ' > > test_expect_success 'setup further non-bitmapped commits' ' > - for i in $(test_seq 1 10) > - do > - test_commit further-$i > - done > + test_commit_bulk --id=further 10 > ' > > rev_list_tests 'partial bitmap' > diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh > index 0367cec5fd..32a1db81a3 100644 > --- a/t/test-lib-functions.sh > +++ b/t/test-lib-functions.sh > @@ -233,6 +233,137 @@ test_merge () { > git tag "$1" > } > > +# Similar to test_commit, but efficiently create <nr> commits, each with a > +# unique number $n (from 1 to <nr> by default) in the commit message. Is it intentional not to follow test_commit's convention of creating a tag as well? If so it would be helpful to note that difference here, or rather, move this documentation to t/README where test_commit and friends are documented.