fast-import: export correctly marks larger than 2^20-1
dump_marks_helper() has a bug when dumping marks larger than 2^20-1, i.e., when the sparse array has more than two levels. The bug was that the 'base' counter was being shifted by 20 bits at level 3, and then again by 10 bits at level 2, rather than a total shift of 20 bits in this argument to the recursive call: (base + k) << m->shift There are two ways to fix this correctly, the elegant: (base + k) << 10 and the one I chose due to edit distance: base + (k << m->shift) Signed-off-by: Raja R Harinath <harinath@hurrynot.org> Acked-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5536934239
commit
7e7db5e452
@ -1666,7 +1666,7 @@ static void dump_marks_helper(FILE *f,
|
||||
if (m->shift) {
|
||||
for (k = 0; k < 1024; k++) {
|
||||
if (m->data.sets[k])
|
||||
dump_marks_helper(f, (base + k) << m->shift,
|
||||
dump_marks_helper(f, base + (k << m->shift),
|
||||
m->data.sets[k]);
|
||||
}
|
||||
} else {
|
||||
|
@ -166,6 +166,63 @@ test_expect_success \
|
||||
test `git rev-parse --verify master:file2` \
|
||||
= `git rev-parse --verify verify--import-marks:copy-of-file2`'
|
||||
|
||||
test_tick
|
||||
mt=$(git hash-object --stdin < /dev/null)
|
||||
: >input.blob
|
||||
: >marks.exp
|
||||
: >tree.exp
|
||||
|
||||
cat >input.commit <<EOF
|
||||
commit refs/heads/verify--dump-marks
|
||||
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||
data <<COMMIT
|
||||
test the sparse array dumping routines with exponentially growing marks
|
||||
COMMIT
|
||||
EOF
|
||||
|
||||
i=0
|
||||
l=4
|
||||
m=6
|
||||
n=7
|
||||
while test "$i" -lt 27; do
|
||||
cat >>input.blob <<EOF
|
||||
blob
|
||||
mark :$l
|
||||
data 0
|
||||
blob
|
||||
mark :$m
|
||||
data 0
|
||||
blob
|
||||
mark :$n
|
||||
data 0
|
||||
EOF
|
||||
echo "M 100644 :$l l$i" >>input.commit
|
||||
echo "M 100644 :$m m$i" >>input.commit
|
||||
echo "M 100644 :$n n$i" >>input.commit
|
||||
|
||||
echo ":$l $mt" >>marks.exp
|
||||
echo ":$m $mt" >>marks.exp
|
||||
echo ":$n $mt" >>marks.exp
|
||||
|
||||
printf "100644 blob $mt\tl$i\n" >>tree.exp
|
||||
printf "100644 blob $mt\tm$i\n" >>tree.exp
|
||||
printf "100644 blob $mt\tn$i\n" >>tree.exp
|
||||
|
||||
l=$(($l + $l))
|
||||
m=$(($m + $m))
|
||||
n=$(($l + $n))
|
||||
|
||||
i=$((1 + $i))
|
||||
done
|
||||
|
||||
sort tree.exp > tree.exp_s
|
||||
|
||||
test_expect_success 'A: export marks with large values' '
|
||||
cat input.blob input.commit | git fast-import --export-marks=marks.large &&
|
||||
git ls-tree refs/heads/verify--dump-marks >tree.out &&
|
||||
test_cmp tree.exp_s tree.out &&
|
||||
test_cmp marks.exp marks.large'
|
||||
|
||||
###
|
||||
### series B
|
||||
###
|
||||
|
Loading…
Reference in New Issue
Block a user