)
'
+test_expect_failure 'apply pseudo-merges during fill-in traversal' '
+ test_when_finished "rm -fr pseudo-merge-fill-in-traversal" &&
+ git init pseudo-merge-fill-in-traversal &&
+ (
+ cd pseudo-merge-fill-in-traversal &&
+
+ git config bitmapPseudoMerge.test.pattern refs/tags/ &&
+ git config bitmapPseudoMerge.test.maxMerges 1 &&
+ git config bitmapPseudoMerge.test.stableThreshold never &&
+
+ test_commit_bulk 64 &&
+ tag_everything &&
+ git repack -ad &&
+
+ pack=$(ls .git/objects/pack/pack-*.pack) &&
+ git rev-parse HEAD~63 >in &&
+ test-tool bitmap write "$(basename $pack)" <in &&
+
+ test_pseudo_merges >merges &&
+ test_line_count = 1 merges &&
+
+ test_commit stale &&
+
+ git rev-list --count --objects HEAD >expect &&
+
+ : >trace2.txt &&
+ GIT_TRACE2_EVENT=$PWD/trace2.txt \
+ git rev-list --count --objects --use-bitmap-index HEAD >actual &&
+ test_pseudo_merges_satisfied 1 <trace2.txt &&
+
+ test_cmp expect actual
+ )
+'
+
+test_expect_failure 'apply pseudo-merges from multiple groups during fill-in' '
+ test_when_finished "rm -fr pseudo-merge-fill-in-multi" &&
+ git init pseudo-merge-fill-in-multi &&
+ (
+ cd pseudo-merge-fill-in-multi &&
+
+ test_commit base &&
+ base=$(git rev-parse HEAD) &&
+
+ for side in left right
+ do
+ git checkout -B $side base &&
+
+ test_commit_bulk --id=$side 64 &&
+ git rev-list --no-object-names HEAD --not $base >in &&
+ while read oid
+ do
+ echo "create refs/group-$side/$oid $oid" || return 1
+ done <in | git update-ref --stdin || return 1
+ done &&
+
+ git checkout left &&
+ git merge right &&
+ git repack -ad &&
+
+ git config bitmapPseudoMerge.left.pattern "refs/group-left/" &&
+ git config bitmapPseudoMerge.left.maxMerges 1 &&
+ git config bitmapPseudoMerge.left.stableThreshold never &&
+
+ git config bitmapPseudoMerge.right.pattern "refs/group-right/" &&
+ git config bitmapPseudoMerge.right.maxMerges 1 &&
+ git config bitmapPseudoMerge.right.stableThreshold never &&
+
+ pack="$(ls .git/objects/pack/pack-*.pack)" &&
+ git rev-parse "$base" >in &&
+ test-tool bitmap write "$(basename $pack)" <in &&
+
+ test_pseudo_merges >merges &&
+ test_line_count = 2 merges &&
+
+ test_commit stale &&
+
+ git rev-list --count --objects HEAD >expect &&
+
+ : >trace2.txt &&
+ GIT_TRACE2_EVENT=$PWD/trace2.txt \
+ git rev-list --count --objects --use-bitmap-index HEAD >actual &&
+ test_pseudo_merges_satisfied 2 <trace2.txt &&
+
+ test_cmp expect actual
+ )
+'
+
+test_expect_failure 'apply pseudo-merges with overlapping groups during fill-in' '
+ test_when_finished "rm -fr pseudo-merge-fill-in-overlap" &&
+ git init pseudo-merge-fill-in-overlap &&
+ (
+ cd pseudo-merge-fill-in-overlap &&
+
+ test_commit_bulk 64 &&
+ tag_everything &&
+ git repack -ad &&
+
+ pack="$(ls .git/objects/pack/pack-*.pack)" &&
+
+ # Use two pseudo-merge group patterns that both match
+ # refs/tags/, so every tagged commit belongs to both
+ # groups. This exercises the extended lookup table
+ # path in apply_pseudo_merges_for_commit().
+ git config bitmapPseudoMerge.all.pattern "refs/tags/" &&
+ git config bitmapPseudoMerge.all.maxMerges 1 &&
+ git config bitmapPseudoMerge.all.stableThreshold never &&
+
+ git config bitmapPseudoMerge.tags.pattern "refs/tags/" &&
+ git config bitmapPseudoMerge.tags.maxMerges 1 &&
+ git config bitmapPseudoMerge.tags.stableThreshold never &&
+
+ git rev-parse HEAD~63 >in &&
+ test-tool bitmap write "$(basename $pack)" <in &&
+
+ test_pseudo_merges >merges &&
+ test_line_count = 2 merges &&
+
+ test_commit stale &&
+
+ git rev-list --count --objects HEAD >expect &&
+
+ : >trace2.txt &&
+ GIT_TRACE2_EVENT=$PWD/trace2.txt \
+ git rev-list --count --objects --use-bitmap-index HEAD >actual &&
+ test_pseudo_merges_satisfied 2 <trace2.txt &&
+
+ test_cmp expect actual
+ )
+'
+
+test_expect_failure 'pseudo-merge commits are correctly classified by date' '
+ test_when_finished "rm -fr pseudo-merge-date-classification" &&
+ git init pseudo-merge-date-classification &&
+ (
+ cd pseudo-merge-date-classification &&
+
+ test_commit_bulk 64 &&
+ tag_everything &&
+ git repack -ad &&
+
+ pack="$(ls .git/objects/pack/pack-*.pack)" &&
+
+ # Configure two pseudo-merge groups: one that only
+ # matches "stable" refs (older than one month), and one
+ # that matches all refs. With 64 freshly-created tags
+ # (all younger than one month) the stable group should
+ # have zero pseudo-merges and the catch-all group should
+ # have one.
+ #
+ # Use GIT_TEST_DATE_NOW to align "now" (and therefore
+ # "1.month.ago") with the test_tick timestamps so that
+ # the commits are within the last month.
+ #
+ # This exercises the date-based classification in
+ # find_pseudo_merge_group_for_ref(), which requires
+ # that commits are parsed before inspecting their date.
+ git config bitmapPseudoMerge.stable.pattern "refs/tags/" &&
+ git config bitmapPseudoMerge.stable.maxMerges 64 &&
+ git config bitmapPseudoMerge.stable.stableThreshold never &&
+ git config bitmapPseudoMerge.stable.threshold 1.month.ago &&
+
+ git config bitmapPseudoMerge.all.pattern "refs/tags/" &&
+ git config bitmapPseudoMerge.all.maxMerges 1 &&
+ git config bitmapPseudoMerge.all.stableThreshold never &&
+ git config bitmapPseudoMerge.all.threshold now &&
+
+ git rev-parse HEAD~63 >in &&
+ GIT_TEST_DATE_NOW=$test_tick \
+ test-tool bitmap write "$(basename $pack)" <in &&
+
+ test_pseudo_merges >merges &&
+ test_line_count = 1 merges
+ )
+'
+
+test_expect_success 'sampleRate=0 does not cause division by zero' '
+ test_when_finished "rm -fr pseudo-merge-sample-rate-zero" &&
+ git init pseudo-merge-sample-rate-zero &&
+ (
+ cd pseudo-merge-sample-rate-zero &&
+
+ test_commit_bulk 64 &&
+ tag_everything &&
+ git repack -ad &&
+
+ pack="$(ls .git/objects/pack/pack-*.pack)" &&
+
+ git config bitmapPseudoMerge.test.pattern "refs/tags/" &&
+ git config bitmapPseudoMerge.test.maxMerges 1 &&
+ git config bitmapPseudoMerge.test.sampleRate 0 &&
+ git config bitmapPseudoMerge.test.threshold now &&
+ git config bitmapPseudoMerge.test.stableThreshold never &&
+
+ git rev-parse HEAD~63 >in &&
+ test-tool bitmap write "$(basename $pack)" <in
+ )
+'
+
test_done