From 8cd7ee7b0d12fce9449ea08fe394e18dc97fe059 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Wed, 15 Jul 2026 08:22:37 +0200 Subject: [PATCH] pack-bitmap: introduce function to open bitmap for a single source The function `prepare_bitmap_git()` opens the first bitmap it can find in any of the object sources connected to the repository. In a subsequent commit, the "packed" object database backend will learn to use bitmaps to answer object filters when enumerating objects. That backend operates on a single object source though, so using a bitmap that potentially belongs to a different source would be wrong: - The source would yield objects that are not part of the source itself. - The object source info would be attributed to the wrong source. - With multiple sources, each source would enumerate the same bitmap another time. Introduce a new function `prepare_bitmap_git_for_source()` that only opens bitmaps belonging to the given object source. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- pack-bitmap.c | 12 ++++++++++++ pack-bitmap.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/pack-bitmap.c b/pack-bitmap.c index 72c8ae3228..09ba15d26b 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -753,6 +753,18 @@ struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx) return NULL; } +struct bitmap_index *prepare_bitmap_git_for_source(struct odb_source_packed *source) +{ + struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git)); + + if (!open_bitmap_for_source(source, bitmap_git) && + !load_bitmap(source->base.odb->repo, bitmap_git, 0)) + return bitmap_git; + + free_bitmap_index(bitmap_git); + return NULL; +} + int bitmap_index_contains_pack(struct bitmap_index *bitmap, struct packed_git *pack) { for (; bitmap; bitmap = bitmap->base) { diff --git a/pack-bitmap.h b/pack-bitmap.h index ae8dc491ac..9f20fb6e56 100644 --- a/pack-bitmap.h +++ b/pack-bitmap.h @@ -9,6 +9,7 @@ #include "string-list.h" struct commit; +struct odb_source_packed; struct repository; struct rev_info; @@ -68,6 +69,7 @@ struct bitmapped_pack { struct bitmap_index *prepare_bitmap_git(struct repository *r); struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx); +struct bitmap_index *prepare_bitmap_git_for_source(struct odb_source_packed *source); /* * Given a bitmap index, determine whether it contains the pack either directly -- 2.47.3