]> git.ipfire.org Git - thirdparty/git.git/commitdiff
midx: stop duplicating info redundant with its owning source
authorPatrick Steinhardt <ps@pks.im>
Mon, 11 Aug 2025 13:46:49 +0000 (15:46 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 11 Aug 2025 16:22:23 +0000 (09:22 -0700)
Multi-pack indices store some information that is redundant with their
owning source:

  - The locality bit that tracks whether the source is the primary
    object source or an alternate.

  - The object directory path the multi-pack index is located in.

  - The pointer to the owning parent directory.

All of this information is already contained in `struct odb_source`. So
now that we always have that struct available when loading a multi-pack
index we have it readily accessible.

Drop the redundant information and instead store a pointer to the object
source.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c
midx-write.c
midx.c
midx.h
pack-bitmap.c
pack-revindex.c
t/helper/test-read-midx.c

index 94dec26f185be80fa95948dec6a7b7021a2844c7..5af3e27357c3ecd905c2ceba69798b099e370efb 100644 (file)
@@ -223,9 +223,10 @@ static void mark_packs_for_deletion(struct existing_packs *existing,
 static void remove_redundant_pack(const char *dir_name, const char *base_name)
 {
        struct strbuf buf = STRBUF_INIT;
-       struct multi_pack_index *m = get_multi_pack_index(the_repository->objects->sources);
+       struct odb_source *source = the_repository->objects->sources;
+       struct multi_pack_index *m = get_multi_pack_index(source);
        strbuf_addf(&buf, "%s.pack", base_name);
-       if (m && m->local && midx_contains_pack(m, buf.buf))
+       if (m && source->local && midx_contains_pack(m, buf.buf))
                clear_midx_file(the_repository);
        strbuf_insertf(&buf, 0, "%s/", dir_name);
        unlink_pack_path(buf.buf, 1);
index bf7c01d4b1d67c3eb9512ec2acbef95abc636ae8..84f76856d67ee9de23ee1ee6bc21f823722c9fa3 100644 (file)
@@ -981,10 +981,11 @@ static int link_midx_to_chain(struct multi_pack_index *m)
        for (i = 0; i < ARRAY_SIZE(midx_exts); i++) {
                const unsigned char *hash = get_midx_checksum(m);
 
-               get_midx_filename_ext(m->repo->hash_algo, &from, m->object_dir,
+               get_midx_filename_ext(m->source->odb->repo->hash_algo, &from,
+                                     m->source->path,
                                      hash, midx_exts[i].non_split);
-               get_split_midx_filename_ext(m->repo->hash_algo, &to,
-                                           m->object_dir, hash,
+               get_split_midx_filename_ext(m->source->odb->repo->hash_algo, &to,
+                                           m->source->path, hash,
                                            midx_exts[i].split);
 
                if (link(from.buf, to.buf) < 0 && errno != ENOENT) {
@@ -1109,7 +1110,7 @@ static int write_midx_internal(struct odb_source *source,
                        if (flags & MIDX_WRITE_BITMAP && load_midx_revindex(m)) {
                                error(_("could not load reverse index for MIDX %s"),
                                      hash_to_hex_algop(get_midx_checksum(m),
-                                                       m->repo->hash_algo));
+                                                       m->source->odb->repo->hash_algo));
                                result = 1;
                                goto cleanup;
                        }
diff --git a/midx.c b/midx.c
index 831a7e9b5f2c085c94b9f0c7114d90e032270128..81bf3c4d5f351e5689cf7462761dea59652106ce 100644 (file)
--- a/midx.c
+++ b/midx.c
@@ -26,7 +26,7 @@ int cmp_idx_or_pack_name(const char *idx_or_pack_name,
 
 const unsigned char *get_midx_checksum(struct multi_pack_index *m)
 {
-       return m->data + m->data_len - m->repo->hash_algo->rawsz;
+       return m->data + m->data_len - m->source->odb->repo->hash_algo->rawsz;
 }
 
 void get_midx_filename(const struct git_hash_algo *hash_algo,
@@ -128,11 +128,10 @@ static struct multi_pack_index *load_multi_pack_index_one(struct odb_source *sou
        midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
 
-       FLEX_ALLOC_STR(m, object_dir, source->path);
+       CALLOC_ARRAY(m, 1);
        m->data = midx_map;
        m->data_len = midx_size;
-       m->local = source->local;
-       m->repo = r;
+       m->source = source;
 
        m->signature = get_be32(m->data);
        if (m->signature != MIDX_SIGNATURE)
@@ -446,7 +445,7 @@ static uint32_t midx_for_pack(struct multi_pack_index **_m,
 int prepare_midx_pack(struct multi_pack_index *m,
                      uint32_t pack_int_id)
 {
-       struct repository *r = m->repo;
+       struct repository *r = m->source->odb->repo;
        struct strbuf pack_name = STRBUF_INIT;
        struct strbuf key = STRBUF_INIT;
        struct packed_git *p;
@@ -458,7 +457,7 @@ int prepare_midx_pack(struct multi_pack_index *m,
        if (m->packs[pack_int_id])
                return 0;
 
-       strbuf_addf(&pack_name, "%s/pack/%s", m->object_dir,
+       strbuf_addf(&pack_name, "%s/pack/%s", m->source->path,
                    m->pack_names[pack_int_id]);
 
        /* pack_map holds the ".pack" name, but we have the .idx */
@@ -469,7 +468,8 @@ int prepare_midx_pack(struct multi_pack_index *m,
                                        strhash(key.buf), key.buf,
                                        struct packed_git, packmap_ent);
        if (!p) {
-               p = add_packed_git(r, pack_name.buf, pack_name.len, m->local);
+               p = add_packed_git(r, pack_name.buf, pack_name.len,
+                                  m->source->local);
                if (p) {
                        install_packed_git(r, p);
                        list_add_tail(&p->mru, &r->objects->packed_git_mru);
@@ -528,7 +528,8 @@ int bsearch_one_midx(const struct object_id *oid, struct multi_pack_index *m,
                     uint32_t *result)
 {
        int ret = bsearch_hash(oid->hash, m->chunk_oid_fanout,
-                              m->chunk_oid_lookup, m->repo->hash_algo->rawsz,
+                              m->chunk_oid_lookup,
+                              m->source->odb->repo->hash_algo->rawsz,
                               result);
        if (result)
                *result += m->num_objects_in_base;
@@ -559,7 +560,7 @@ struct object_id *nth_midxed_object_oid(struct object_id *oid,
        n = midx_for_object(&m, n);
 
        oidread(oid, m->chunk_oid_lookup + st_mult(m->hash_len, n),
-               m->repo->hash_algo);
+               m->source->odb->repo->hash_algo);
        return oid;
 }
 
@@ -734,7 +735,7 @@ int prepare_multi_pack_index_one(struct odb_source *source)
 
 int midx_checksum_valid(struct multi_pack_index *m)
 {
-       return hashfile_checksum_valid(m->repo->hash_algo,
+       return hashfile_checksum_valid(m->source->odb->repo->hash_algo,
                                       m->data, m->data_len);
 }
 
diff --git a/midx.h b/midx.h
index d162001fbbe2b37371105a4ce7ca11241a0fad96..71dbdec66ef6188391fa86c5db74f375959434d7 100644 (file)
--- a/midx.h
+++ b/midx.h
@@ -35,6 +35,8 @@ struct odb_source;
        "GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL"
 
 struct multi_pack_index {
+       struct odb_source *source;
+
        const unsigned char *data;
        size_t data_len;
 
@@ -50,7 +52,6 @@ struct multi_pack_index {
        uint32_t num_objects;
        int preferred_pack_idx;
 
-       int local;
        int has_chain;
 
        const unsigned char *chunk_pack_names;
@@ -71,10 +72,6 @@ struct multi_pack_index {
 
        const char **pack_names;
        struct packed_git **packs;
-
-       struct repository *repo;
-
-       char object_dir[FLEX_ARRAY];
 };
 
 #define MIDX_PROGRESS     (1 << 0)
index fb0b11ca073856ed5b70a6e66a30085d34465f56..01e14c34bd0caccdd3eff74ae391eea9b1fe45fb 100644 (file)
@@ -216,7 +216,7 @@ static uint32_t bitmap_num_objects(struct bitmap_index *index)
 static struct repository *bitmap_repo(struct bitmap_index *bitmap_git)
 {
        if (bitmap_is_midx(bitmap_git))
-               return bitmap_git->midx->repo;
+               return bitmap_git->midx->source->odb->repo;
        return bitmap_git->pack->repo;
 }
 
@@ -418,13 +418,13 @@ char *midx_bitmap_filename(struct multi_pack_index *midx)
 {
        struct strbuf buf = STRBUF_INIT;
        if (midx->has_chain)
-               get_split_midx_filename_ext(midx->repo->hash_algo, &buf,
-                                           midx->object_dir,
+               get_split_midx_filename_ext(midx->source->odb->repo->hash_algo, &buf,
+                                           midx->source->path,
                                            get_midx_checksum(midx),
                                            MIDX_EXT_BITMAP);
        else
-               get_midx_filename_ext(midx->repo->hash_algo, &buf,
-                                     midx->object_dir, get_midx_checksum(midx),
+               get_midx_filename_ext(midx->source->odb->repo->hash_algo, &buf,
+                                     midx->source->path, get_midx_checksum(midx),
                                      MIDX_EXT_BITMAP);
 
        return strbuf_detach(&buf, NULL);
@@ -463,7 +463,8 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,
 
        if (bitmap_git->pack || bitmap_git->midx) {
                struct strbuf buf = STRBUF_INIT;
-               get_midx_filename(midx->repo->hash_algo, &buf, midx->object_dir);
+               get_midx_filename(midx->source->odb->repo->hash_algo, &buf,
+                                 midx->source->path);
                trace2_data_string("bitmap", bitmap_repo(bitmap_git),
                                   "ignoring extra midx bitmap file", buf.buf);
                close(fd);
index 0cc422a1e67bc84477daf3526edebcce3a05eb39..b206518dcb51ddaa7c0f52e0d55c72bd6d2fbfea 100644 (file)
@@ -379,25 +379,25 @@ int load_midx_revindex(struct multi_pack_index *m)
                 * not want to accidentally call munmap() in the middle of the
                 * MIDX.
                 */
-               trace2_data_string("load_midx_revindex", m->repo,
+               trace2_data_string("load_midx_revindex", m->source->odb->repo,
                                   "source", "midx");
                m->revindex_data = (const uint32_t *)m->chunk_revindex;
                return 0;
        }
 
-       trace2_data_string("load_midx_revindex", m->repo,
+       trace2_data_string("load_midx_revindex", m->source->odb->repo,
                           "source", "rev");
 
        if (m->has_chain)
-               get_split_midx_filename_ext(m->repo->hash_algo, &revindex_name,
-                                           m->object_dir, get_midx_checksum(m),
+               get_split_midx_filename_ext(m->source->odb->repo->hash_algo, &revindex_name,
+                                           m->source->path, get_midx_checksum(m),
                                            MIDX_EXT_REV);
        else
-               get_midx_filename_ext(m->repo->hash_algo, &revindex_name,
-                                     m->object_dir, get_midx_checksum(m),
+               get_midx_filename_ext(m->source->odb->repo->hash_algo, &revindex_name,
+                                     m->source->path, get_midx_checksum(m),
                                      MIDX_EXT_REV);
 
-       ret = load_revindex_from_disk(m->repo->hash_algo,
+       ret = load_revindex_from_disk(m->source->odb->repo->hash_algo,
                                      revindex_name.buf,
                                      m->num_objects,
                                      &m->revindex_map,
index bcb8ea767179a6b586ecada69f96ee36866fa375..6de5d1665afbfc8a6bee29983107cd1c8e28a98b 100644 (file)
@@ -66,7 +66,7 @@ static int read_midx_file(const char *object_dir, const char *checksum,
        for (i = 0; i < m->num_packs; i++)
                printf("%s\n", m->pack_names[i]);
 
-       printf("object-dir: %s\n", m->object_dir);
+       printf("object-dir: %s\n", m->source->path);
 
        if (show_objects) {
                struct object_id oid;