]> git.ipfire.org Git - thirdparty/git.git/commitdiff
midx: access pack names through `nth_midxed_pack_name()`
authorTaylor Blau <me@ttaylorr.com>
Wed, 28 May 2025 22:59:00 +0000 (18:59 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 29 May 2025 19:53:46 +0000 (12:53 -0700)
Accessing a MIDX's 'pack_names' array is somewhat error-prone when
dealing with incremental MIDX chains, where the (global) pack_int_id for
some pack may differ from the containing layer's index for that pack.

Introduce `nth_midxed_pack_name()` in an effort to reduce a common
source of errors by discouraging external callers from accessing a
layer's `pack_names` array directly.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
midx.c
midx.h
pack-bitmap.c
t/helper/test-read-midx.c

diff --git a/midx.c b/midx.c
index cd6e766ce2b15821995dbaf0dc5534136ed9969d..6705e778810a8543a8c1aefc8067ddc71fe63a6b 100644 (file)
--- a/midx.c
+++ b/midx.c
@@ -506,6 +506,13 @@ struct packed_git *nth_midxed_pack(struct multi_pack_index *m,
        return m->packs[local_pack_int_id];
 }
 
+const char *nth_midxed_pack_name(struct multi_pack_index *m,
+                                uint32_t pack_int_id)
+{
+       uint32_t local_pack_int_id = midx_for_pack(&m, pack_int_id);
+       return m->pack_names[local_pack_int_id];
+}
+
 #define MIDX_CHUNK_BITMAPPED_PACKS_WIDTH (2 * sizeof(uint32_t))
 
 int nth_bitmapped_pack(struct repository *r, struct multi_pack_index *m,
diff --git a/midx.h b/midx.h
index 9d1374cbd58d016bb82338337b2a4e5ba7234092..0fb490f4d4abfabe0a5c8ef571bdcbd4f55319d0 100644 (file)
--- a/midx.h
+++ b/midx.h
@@ -107,6 +107,8 @@ struct multi_pack_index *load_multi_pack_index(struct repository *r,
 int prepare_midx_pack(struct repository *r, struct multi_pack_index *m, uint32_t pack_int_id);
 struct packed_git *nth_midxed_pack(struct multi_pack_index *m,
                                   uint32_t pack_int_id);
+const char *nth_midxed_pack_name(struct multi_pack_index *m,
+                                uint32_t pack_int_id);
 int nth_bitmapped_pack(struct repository *r, struct multi_pack_index *m,
                       struct bitmapped_pack *bp, uint32_t pack_int_id);
 int bsearch_one_midx(const struct object_id *oid, struct multi_pack_index *m,
index ac6d62b980c5a8d086bb1b71f46df721d11b3ad4..753dd19b1d0f501319e3c924112100e79f406d9b 100644 (file)
@@ -490,7 +490,7 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,
        for (i = 0; i < bitmap_git->midx->num_packs + bitmap_git->midx->num_packs_in_base; i++) {
                if (prepare_midx_pack(bitmap_repo(bitmap_git), bitmap_git->midx, i)) {
                        warning(_("could not open pack %s"),
-                               bitmap_git->midx->pack_names[i]);
+                               nth_midxed_pack_name(bitmap_git->midx, i));
                        goto cleanup;
                }
        }
@@ -2469,7 +2469,7 @@ void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
                        struct bitmapped_pack pack;
                        if (nth_bitmapped_pack(r, bitmap_git->midx, &pack, i) < 0) {
                                warning(_("unable to load pack: '%s', disabling pack-reuse"),
-                                       bitmap_git->midx->pack_names[i]);
+                                       nth_midxed_pack_name(bitmap_git->midx, i));
                                free(packs);
                                return;
                        }
index ac81390899aef0b5bb909e4923f30ffb463a6c74..fbed0f6919857bedec177e2dd4424697491f9706 100644 (file)
@@ -53,8 +53,9 @@ static int read_midx_file(const char *object_dir, const char *checksum,
        printf("\nnum_objects: %d\n", m->num_objects);
 
        printf("packs:\n");
-       for (i = 0; i < m->num_packs; i++)
-               printf("%s\n", m->pack_names[i]);
+       for (i = m->num_packs_in_base; i < m->num_packs + m->num_packs_in_base;
+            i++)
+               printf("%s\n", nth_midxed_pack_name(m, i));
 
        printf("object-dir: %s\n", m->object_dir);
 
@@ -108,7 +109,7 @@ static int read_midx_preferred_pack(const char *object_dir)
                return 1;
        }
 
-       printf("%s\n", midx->pack_names[preferred_pack]);
+       printf("%s\n", nth_midxed_pack_name(midx, preferred_pack));
        close_midx(midx);
        return 0;
 }