From b424879085f316b6c9b96d4591339f33c8371737 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Mon, 31 Aug 2026 08:46:22 +0200 Subject: [PATCH] builtin/fsck: move bitmap verification into the packed source The checks for bitmaps live in `verify_bitmap_files()`, which is called by "builtin/fsck.c". These checks are obviously specific to the "packed" backend. Move the logic into `odb_source_packed_fsck()`. As in preceding commits, this means that we now properly honor both "--connectivity-only" and "--no-full". Furthermore, we drop the dedicated `ERROR_BITMAP` bit and instead use the generic `ERROR_OBJECT` bit. Note that this change also adapts `verify_bitmap_files()` to be focused on a single "packed" source instead of verifying bitmaps from all sources. This change is required as we already know to loop around the sources in `odb_fsck()` itself. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- builtin/fsck.c | 5 ----- odb/source-packed.c | 3 +++ pack-bitmap.c | 26 ++++++++++---------------- pack-bitmap.h | 2 +- t/t5326-multi-pack-bitmaps.sh | 10 +++++++++- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/builtin/fsck.c b/builtin/fsck.c index 06e72877f3..2f7d29aa56 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -23,7 +23,6 @@ #include "run-command.h" #include "sparse-index.h" #include "worktree.h" -#include "pack-bitmap.h" #define REACHABLE 0x0001 #define SEEN 0x0002 @@ -50,7 +49,6 @@ static timestamp_t now; #define ERROR_REFS 010 #define ERROR_COMMIT_GRAPH 020 #define ERROR_MULTI_PACK_INDEX 040 -#define ERROR_BITMAP 0200 static const char *describe_object(const struct object_id *oid) { @@ -1068,9 +1066,6 @@ int cmd_fsck(int argc, free_worktrees(worktrees); } - if (verify_bitmap_files(repo)) - errors_found |= ERROR_BITMAP; - check_connectivity(repo); if (repo->settings.core_commit_graph) { diff --git a/odb/source-packed.c b/odb/source-packed.c index e5e69636dd..2b5dc502f5 100644 --- a/odb/source-packed.c +++ b/odb/source-packed.c @@ -909,6 +909,9 @@ static int odb_source_packed_fsck(struct odb_source *source, if (verify_reverse_indices(packed, opts) < 0) ret = -1; + if (verify_bitmap_files(packed)) + ret = -1; + return ret; } diff --git a/pack-bitmap.c b/pack-bitmap.c index e0fb57d332..3de8e9590c 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -3410,28 +3410,22 @@ static int verify_bitmap_file(const struct git_hash_algo *algop, return res; } -int verify_bitmap_files(struct repository *r) +int verify_bitmap_files(struct odb_source_packed *source) { - struct odb_source *source; - struct packed_git *p; + struct packfile_list_entry *e; + struct multi_pack_index *m; int res = 0; - for (source = r->objects->sources; source; source = source->next) { - struct odb_source_files *files = odb_source_files_downcast(source); - struct multi_pack_index *m = get_multi_pack_index(files->packed); - char *midx_bitmap_name; - - if (!m) - continue; - - midx_bitmap_name = midx_bitmap_filename(m); - res |= verify_bitmap_file(r->hash_algo, midx_bitmap_name); + m = get_multi_pack_index(source); + if (m) { + char *midx_bitmap_name = midx_bitmap_filename(m); + res |= verify_bitmap_file(source->base.odb->repo->hash_algo, midx_bitmap_name); free(midx_bitmap_name); } - repo_for_each_pack(r, p) { - char *pack_bitmap_name = pack_bitmap_filename(p); - res |= verify_bitmap_file(r->hash_algo, pack_bitmap_name); + for (e = packfile_store_get_packs(source); e; e = e->next) { + char *pack_bitmap_name = pack_bitmap_filename(e->pack); + res |= verify_bitmap_file(source->base.odb->repo->hash_algo, pack_bitmap_name); free(pack_bitmap_name); } diff --git a/pack-bitmap.h b/pack-bitmap.h index 1385027c1f..847ad4762d 100644 --- a/pack-bitmap.h +++ b/pack-bitmap.h @@ -205,7 +205,7 @@ int bitmap_is_midx(struct bitmap_index *bitmap_git); int bitmap_is_preferred_refname(struct repository *r, const char *refname); -int verify_bitmap_files(struct repository *r); +int verify_bitmap_files(struct odb_source_packed *source); struct ewah_bitmap *read_bitmap(const unsigned char *map, size_t map_size, size_t *map_pos); diff --git a/t/t5326-multi-pack-bitmaps.sh b/t/t5326-multi-pack-bitmaps.sh index 86beab1dae..8047459b00 100755 --- a/t/t5326-multi-pack-bitmaps.sh +++ b/t/t5326-multi-pack-bitmaps.sh @@ -498,7 +498,15 @@ test_expect_success 'git fsck correctly identifies good and bad bitmaps' ' corrupt_file "$packbitmap" && test_must_fail git fsck 2>err && test_grep "bitmap file '\''$midxbitmap'\'' has invalid checksum" err && - test_grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err + test_grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err && + + # The bitmap checks are performed with "--no-full", but not with + # "--connectivity-only". + test_must_fail git fsck --no-full 2>err && + test_grep "bitmap file '\''$midxbitmap'\'' has invalid checksum" err && + test_grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err && + git fsck --connectivity-only 2>err && + test_grep ! "invalid checksum" err ' test_expect_success 'corrupt MIDX with bitmap causes fallback' '