From: Taylor Blau Date: Wed, 28 May 2025 22:59:00 +0000 (-0400) Subject: midx: access pack names through `nth_midxed_pack_name()` X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=93020349a44a97670643fdd714845e1d576eb89d;p=thirdparty%2Fgit.git midx: access pack names through `nth_midxed_pack_name()` 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 Signed-off-by: Junio C Hamano --- diff --git a/midx.c b/midx.c index cd6e766ce2..6705e77881 100644 --- 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 9d1374cbd5..0fb490f4d4 100644 --- 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, diff --git a/pack-bitmap.c b/pack-bitmap.c index ac6d62b980..753dd19b1d 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -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; } diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c index ac81390899..fbed0f6919 100644 --- a/t/helper/test-read-midx.c +++ b/t/helper/test-read-midx.c @@ -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; }