]> git.ipfire.org Git - thirdparty/git.git/commitdiff
midx: teach `midx_fanout_add_midx_fanout()` about incremental MIDXs
authorTaylor Blau <me@ttaylorr.com>
Tue, 6 Aug 2024 15:37:52 +0000 (11:37 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 6 Aug 2024 19:01:38 +0000 (12:01 -0700)
The function `midx_fanout_add_midx_fanout()` is used to help construct
the fanout table when generating a MIDX by reusing data from an existing
MIDX.

Prepare this function to work with incremental MIDXs by making a few
changes:

  - The bounds checks need to be adjusted to start object lookups taking
    into account the number of objects in the previous MIDX layer (i.e.,
    by starting the lookups at position `m->num_objects_in_base` instead
    of position 0).

  - Likewise, the bounds checks need to end at `m->num_objects_in_base`
    objects after `m->num_objects`.

  - Finally, `midx_fanout_add_midx_fanout()` needs to recur on earlier
    MIDX layers when dealing with an incremental MIDX chain by calling
    itself when given a MIDX with a non-NULL `base_midx`.

Note that after 0c5a62f14b (midx-write.c: do not read existing MIDX with
`packs_to_include`, 2024-06-11), we do not use this function with an
existing MIDX (incremental or not) when generating a MIDX with
--stdin-packs, and likewise for incremental MIDXs.

But it is still used when adding the fanout table from an incremental
MIDX when generating a non-incremental MIDX (without --stdin-packs, of
course).

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
midx-write.c

index 478b42e72099b5413bda6673df8abaf86a158979..d5275d719befbaca3b050cd836caff73ebe0e89d 100644 (file)
@@ -196,7 +196,7 @@ static int nth_midxed_pack_midx_entry(struct multi_pack_index *m,
                                      struct pack_midx_entry *e,
                                      uint32_t pos)
 {
-       if (pos >= m->num_objects)
+       if (pos >= m->num_objects + m->num_objects_in_base)
                return 1;
 
        nth_midxed_object_oid(&e->oid, m, pos);
@@ -247,12 +247,16 @@ static void midx_fanout_add_midx_fanout(struct midx_fanout *fanout,
                                        uint32_t cur_fanout,
                                        int preferred_pack)
 {
-       uint32_t start = 0, end;
+       uint32_t start = m->num_objects_in_base, end;
        uint32_t cur_object;
 
+       if (m->base_midx)
+               midx_fanout_add_midx_fanout(fanout, m->base_midx, cur_fanout,
+                                           preferred_pack);
+
        if (cur_fanout)
-               start = ntohl(m->chunk_oid_fanout[cur_fanout - 1]);
-       end = ntohl(m->chunk_oid_fanout[cur_fanout]);
+               start += ntohl(m->chunk_oid_fanout[cur_fanout - 1]);
+       end = m->num_objects_in_base + ntohl(m->chunk_oid_fanout[cur_fanout]);
 
        for (cur_object = start; cur_object < end; cur_object++) {
                if ((preferred_pack > -1) &&