]> git.ipfire.org Git - thirdparty/git.git/commit - builtin/pack-objects.c
pack-bitmap-write.c: gracefully fail to write non-closed bitmaps
authorTaylor Blau <me@ttaylorr.com>
Tue, 24 Aug 2021 16:15:54 +0000 (12:15 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Aug 2021 20:21:13 +0000 (13:21 -0700)
commit3ba3d0621b6822e974f06123db9394b33e454ed7
tree1109de708b1903da2496b273de98daf057e2c4e4
parentfa95666a403e5dda4c2c14ac168b5c3389126e6c
pack-bitmap-write.c: gracefully fail to write non-closed bitmaps

The set of objects covered by a bitmap must be closed under
reachability, since it must be the case that there is a valid bit
position assigned for every possible reachable object (otherwise the
bitmaps would be incomplete).

Pack bitmaps are never written from 'git repack' unless repacking
all-into-one, and so we never write non-closed bitmaps (except in the
case of partial clones where we aren't guaranteed to have all objects).

But multi-pack bitmaps change this, since it isn't known whether the
set of objects in the MIDX is closed under reachability until walking
them. Plumb through a bit that is set when a reachable object isn't
found.

As soon as a reachable object isn't found in the set of objects to
include in the bitmap, bitmap_writer_build() knows that the set is not
closed, and so it now fails gracefully.

A test is added in t0410 to trigger a bitmap write without full
reachability closure by removing local copies of some reachable objects
from a promisor remote.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c
pack-bitmap-write.c
pack-bitmap.h
t/t0410-partial-clone.sh