pack-bitmap.c: teach `bitmap_for_commit()` about incremental MIDXs

The pack-bitmap machinery uses `bitmap_for_commit()` to locate the EWAH-compressed bitmap corresponding to some given commit object. Teach this function about incremental MIDX bitmaps by teaching it to recur on earlier bitmap layers when it fails to find a given commit in the current layer. The changes to do so are as follows: - Avoid initializing hash_pos at its declaration, since bitmap_for_commit() is now a recursive function and may receive a NULL bitmap_index pointer as its first argument. - In cases where we would previously return NULL (to indicate that a lookup failed and the given bitmap_index does not contain an entry corresponding to the given commit), recursively call the function on the previous bitmap layer. Signed-off-by: Taylor Blau <me@ttaylorr.com> Acked-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Taylor Blau committed Mar 20, 2025 at 13:56 UTC ae61324f0a6124534a245b70d55d63b5abf3e5d4
1 file changed +7 -4
pack-bitmap.c
+7 -4
@@ -941,18 +941,21 @@ corrupt:
941 struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
942 struct commit *commit)
943 {
944 - khiter_t hash_pos = kh_get_oid_map(bitmap_git->bitmaps,
945 - commit->object.oid);
944 + khiter_t hash_pos;
945 + if (!bitmap_git)
946 + return NULL;
947 +
948 + hash_pos = kh_get_oid_map(bitmap_git->bitmaps, commit->object.oid);
949 if (hash_pos >= kh_end(bitmap_git->bitmaps)) {
950 struct stored_bitmap *bitmap = NULL;
951 if (!bitmap_git->table_lookup)
949 - return NULL;
952 + return bitmap_for_commit(bitmap_git->base, commit);
953
954 /* this is a fairly hot codepath - no trace2_region please */
955 /* NEEDSWORK: cache misses aren't recorded */
956 bitmap = lazy_bitmap_for_commit(bitmap_git, commit);
957 if (!bitmap)
955 - return NULL;
958 + return bitmap_for_commit(bitmap_git->base, commit);
959 return lookup_stored_bitmap(bitmap);
960 }
961 return lookup_stored_bitmap(kh_value(bitmap_git->bitmaps, hash_pos));