diff options
| author | Patrick Steinhardt <ps@pks.im> | 2026-07-15 08:22:37 +0200 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-07-15 07:19:16 -0700 |
| commit | 8cd7ee7b0d12fce9449ea08fe394e18dc97fe059 (patch) | |
| tree | 95fb5772ce95fc5dc5612a4f898e01d80f793096 | |
| parent | db95bfc121aa9725e8128d7b1dd73330c0beb7f9 (diff) | |
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 <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | pack-bitmap.c | 12 | ||||
| -rw-r--r-- | pack-bitmap.h | 2 |
2 files changed, 14 insertions, 0 deletions
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 |
