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>
main
Patrick Steinhardt 2026-07-15 08:22:37 +02:00 committed by Junio C Hamano
parent db95bfc121
commit 8cd7ee7b0d
2 changed files with 14 additions and 0 deletions

View File

@ -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) {

View File

@ -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