pack-bitmap-write: rebuild using new bitmap when remapping

`git repack` is about to learn a new `--filter=<filter-spec>` option and we will want to check that this option is incompatible with `--write-bitmap-index`. Unfortunately it appears that a test like: test_expect_success '--filter fails with --write-bitmap-index' ' test_must_fail \ env GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 \ git -C bare.git repack -a -d --write-bitmap-index --filter=blob:none ' sometimes fail because when rebuilding bitmaps, it appears that we are reusing existing bitmap information. So instead of detecting that some objects are missing and erroring out as it should, the `git repack --write-bitmap-index --filter=...` command succeeds. Let's fix that by making sure we rebuild bitmaps using new bitmaps instead of existing ones. Helped-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Christian Couder committed Oct 2, 2023 at 18:55 UTC 0e4747ec8b5558e7106146fd37501649f577bcfa
1 file changed +5 -1
pack-bitmap-write.c
+5 -1
@@ -413,15 +413,19 @@ static int fill_bitmap_commit(struct bb_commit *ent,
413
414 if (old_bitmap && mapping) {
415 struct ewah_bitmap *old = bitmap_for_commit(old_bitmap, c);
416 + struct bitmap *remapped = bitmap_new();
417 /*
418 * If this commit has an old bitmap, then translate that
419 * bitmap and add its bits to this one. No need to walk
420 * parents or the tree for this commit.
421 */
421 - if (old && !rebuild_bitmap(mapping, old, ent->bitmap)) {
422 + if (old && !rebuild_bitmap(mapping, old, remapped)) {
423 + bitmap_or(ent->bitmap, remapped);
424 + bitmap_free(remapped);
425 reused_bitmaps_nr++;
426 continue;
427 }
428 + bitmap_free(remapped);
429 }
430
431 /*