]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap.c: teach `bitmap_for_commit()` about incremental MIDXs
authorTaylor Blau <me@ttaylorr.com>
Thu, 20 Mar 2025 17:56:37 +0000 (13:56 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 21 Mar 2025 11:33:41 +0000 (04:33 -0700)
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>
pack-bitmap.c

index e84211de158721f607ce077d76c3e50bbac71f7d..17f1087fba33c470ce38dbcbcbc8c0994546b24c 100644 (file)
@@ -941,18 +941,21 @@ corrupt:
 struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
                                      struct commit *commit)
 {
-       khiter_t hash_pos = kh_get_oid_map(bitmap_git->bitmaps,
-                                          commit->object.oid);
+       khiter_t hash_pos;
+       if (!bitmap_git)
+               return NULL;
+
+       hash_pos = kh_get_oid_map(bitmap_git->bitmaps, commit->object.oid);
        if (hash_pos >= kh_end(bitmap_git->bitmaps)) {
                struct stored_bitmap *bitmap = NULL;
                if (!bitmap_git->table_lookup)
-                       return NULL;
+                       return bitmap_for_commit(bitmap_git->base, commit);
 
                /* this is a fairly hot codepath - no trace2_region please */
                /* NEEDSWORK: cache misses aren't recorded */
                bitmap = lazy_bitmap_for_commit(bitmap_git, commit);
                if (!bitmap)
-                       return NULL;
+                       return bitmap_for_commit(bitmap_git->base, commit);
                return lookup_stored_bitmap(bitmap);
        }
        return lookup_stored_bitmap(kh_value(bitmap_git->bitmaps, hash_pos));