]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap: return multiple packs via `reuse_partial_packfile_from_bitmap()`
authorTaylor Blau <me@ttaylorr.com>
Thu, 14 Dec 2023 22:24:04 +0000 (17:24 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 14 Dec 2023 22:38:08 +0000 (14:38 -0800)
Further prepare for enabling verbatim pack-reuse over multiple packfiles
by changing the signature of reuse_partial_packfile_from_bitmap() to
populate an array of `struct bitmapped_pack *`'s instead of a pointer to
a single packfile.

Since the array we're filling out is sized dynamically[^1], add an
additional `size_t *` parameter which will hold the number of reusable
packs (equal to the number of elements in the array).

Note that since we still have not implemented true multi-pack reuse,
these changes aren't propagated out to the rest of the caller in
builtin/pack-objects.c.

In the interim state, we expect that the array has a single element, and
we use that element to fill out the static `reuse_packfile` variable
(which is a bog-standard `struct packed_git *`). Future commits will
continue to push this change further out through the pack-objects code.

[^1]: That is, even though we know the number of packs which are
  candidates for pack-reuse, we do not know how many of those
  candidates we can actually reuse.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c
pack-bitmap.c
pack-bitmap.h

index c3df6d9657e3b2876def7b445d60d1bd8c7f73bd..87e16636a8035941bdcaf3b03c76343abe6ba4e3 100644 (file)
@@ -3940,14 +3940,19 @@ static int pack_options_allow_reuse(void)
 
 static int get_object_list_from_bitmap(struct rev_info *revs)
 {
+       struct bitmapped_pack *packs = NULL;
+       size_t packs_nr = 0;
+
        if (!(bitmap_git = prepare_bitmap_walk(revs, 0)))
                return -1;
 
        if (pack_options_allow_reuse())
-               reuse_partial_packfile_from_bitmap(bitmap_git, &reuse_packfile,
+               reuse_partial_packfile_from_bitmap(bitmap_git, &packs,
+                                                  &packs_nr,
                                                   &reuse_packfile_bitmap);
 
-       if (reuse_packfile) {
+       if (packs) {
+               reuse_packfile = packs[0].p;
                reuse_packfile_objects = bitmap_popcount(reuse_packfile_bitmap);
                if (!reuse_packfile_objects)
                        BUG("expected non-empty reuse bitmap");
index c75a83e9cceeb2e76f1139089369dbe0f0fd105e..4d5a48467832c11b7d08f5a83603681467d6175b 100644 (file)
@@ -2001,7 +2001,8 @@ static int bitmapped_pack_cmp(const void *va, const void *vb)
 }
 
 void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
-                                       struct packed_git **packfile_out,
+                                       struct bitmapped_pack **packs_out,
+                                       size_t *packs_nr_out,
                                        struct bitmap **reuse_out)
 {
        struct repository *r = the_repository;
@@ -2069,7 +2070,8 @@ void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
         * need to be handled separately.
         */
        bitmap_and_not(result, reuse);
-       *packfile_out = packs[0].p;
+       *packs_out = packs;
+       *packs_nr_out = packs_nr;
        *reuse_out = reuse;
 }
 
index ab3fdcde6b7526b0dde39691248f6523ac843c3c..7a12a2ce81e02c1b6e825924fbe16c4da953da48 100644 (file)
@@ -78,8 +78,9 @@ int test_bitmap_hashes(struct repository *r);
 struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
                                         int filter_provided_objects);
 uint32_t midx_preferred_pack(struct bitmap_index *bitmap_git);
-void reuse_partial_packfile_from_bitmap(struct bitmap_index *,
-                                       struct packed_git **packfile,
+void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
+                                       struct bitmapped_pack **packs_out,
+                                       size_t *packs_nr_out,
                                        struct bitmap **reuse_out);
 int rebuild_existing_bitmaps(struct bitmap_index *, struct packing_data *mapping,
                             kh_oid_map_t *reused_bitmaps, int show_progress);