t5333: demonstrate various pseudo-merge bugs
Using the test helper introduced via the previous commit, add various failing tests demonstrating bugs in the pseudo-merge implementation. These are all marked as failing with one exception. The "sampleRate=0" test describes a latent bug, which is only reachable through a code path that is itself masked by a separate bug. A future commit will fix that bug, and, in turn, cause the aforementioned test to fail. Accordingly, that commit will mark the test as failing, and it will be re-marked as passing in a separate commit which fixes the once-latent bug. For the rest: the following commits will explain and fix the underlying bugs in detail. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>main
parent
bc2f611569
commit
49369d8290
|
|
@ -462,4 +462,202 @@ test_expect_success 'use pseudo-merge in boundary traversal' '
|
|||
)
|
||||
'
|
||||
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue