]> git.ipfire.org Git - thirdparty/git.git/commitdiff
midx: expose `write_midx_file_only()` publicly
authorTaylor Blau <me@ttaylorr.com>
Wed, 29 Sep 2021 01:55:01 +0000 (21:55 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 29 Sep 2021 04:20:55 +0000 (21:20 -0700)
Expose a variant of the write_midx_file() function which ignores packs
that aren't included in an explicit "allow" list.

This will be used in an upcoming patch to power a new `--stdin-packs`
mode of `git multi-pack-index write` for callers that only want to
include certain packs in a MIDX (and ignore any packs which may have
happened to enter the repository independently, e.g., from pushes).

Those patches will provide test coverage for this new function.

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

diff --git a/midx.c b/midx.c
index 864034a6ade5fdc61f7287227767de01b31b0267..5533361997b1dc5aacbafa210fdebafdfbe969ce 100644 (file)
--- a/midx.c
+++ b/midx.c
@@ -475,6 +475,8 @@ struct write_midx_context {
        uint32_t num_large_offsets;
 
        int preferred_pack_idx;
+
+       struct string_list *to_include;
 };
 
 static void add_pack_to_midx(const char *full_path, size_t full_path_len,
@@ -484,8 +486,26 @@ static void add_pack_to_midx(const char *full_path, size_t full_path_len,
 
        if (ends_with(file_name, ".idx")) {
                display_progress(ctx->progress, ++ctx->pack_paths_checked);
+               /*
+                * Note that at most one of ctx->m and ctx->to_include are set,
+                * so we are testing midx_contains_pack() and
+                * string_list_has_string() independently (guarded by the
+                * appropriate NULL checks).
+                *
+                * We could support passing to_include while reusing an existing
+                * MIDX, but don't currently since the reuse process drags
+                * forward all packs from an existing MIDX (without checking
+                * whether or not they appear in the to_include list).
+                *
+                * If we added support for that, these next two conditional
+                * should be performed independently (likely checking
+                * to_include before the existing MIDX).
+                */
                if (ctx->m && midx_contains_pack(ctx->m, file_name))
                        return;
+               else if (ctx->to_include &&
+                        !string_list_has_string(ctx->to_include, file_name))
+                       return;
 
                ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
 
@@ -1058,6 +1078,7 @@ cleanup:
 }
 
 static int write_midx_internal(const char *object_dir,
+                              struct string_list *packs_to_include,
                               struct string_list *packs_to_drop,
                               const char *preferred_pack_name,
                               unsigned flags)
@@ -1082,10 +1103,17 @@ static int write_midx_internal(const char *object_dir,
                die_errno(_("unable to create leading directories of %s"),
                          midx_name);
 
-       for (cur = get_multi_pack_index(the_repository); cur; cur = cur->next) {
-               if (!strcmp(object_dir, cur->object_dir)) {
-                       ctx.m = cur;
-                       break;
+       if (!packs_to_include) {
+               /*
+                * Only reference an existing MIDX when not filtering which
+                * packs to include, since all packs and objects are copied
+                * blindly from an existing MIDX if one is present.
+                */
+               for (cur = get_multi_pack_index(the_repository); cur; cur = cur->next) {
+                       if (!strcmp(object_dir, cur->object_dir)) {
+                               ctx.m = cur;
+                               break;
+                       }
                }
        }
 
@@ -1136,10 +1164,13 @@ static int write_midx_internal(const char *object_dir,
        else
                ctx.progress = NULL;
 
+       ctx.to_include = packs_to_include;
+
        for_each_file_in_pack_dir(object_dir, add_pack_to_midx, &ctx);
        stop_progress(&ctx.progress);
 
-       if (ctx.m && ctx.nr == ctx.m->num_packs && !packs_to_drop) {
+       if ((ctx.m && ctx.nr == ctx.m->num_packs) &&
+           !(packs_to_include || packs_to_drop)) {
                struct bitmap_index *bitmap_git;
                int bitmap_exists;
                int want_bitmap = flags & MIDX_WRITE_BITMAP;
@@ -1380,7 +1411,17 @@ int write_midx_file(const char *object_dir,
                    const char *preferred_pack_name,
                    unsigned flags)
 {
-       return write_midx_internal(object_dir, NULL, preferred_pack_name, flags);
+       return write_midx_internal(object_dir, NULL, NULL, preferred_pack_name,
+                                  flags);
+}
+
+int write_midx_file_only(const char *object_dir,
+                        struct string_list *packs_to_include,
+                        const char *preferred_pack_name,
+                        unsigned flags)
+{
+       return write_midx_internal(object_dir, packs_to_include, NULL,
+                                  preferred_pack_name, flags);
 }
 
 struct clear_midx_data {
@@ -1660,7 +1701,7 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
        free(count);
 
        if (packs_to_drop.nr) {
-               result = write_midx_internal(object_dir, &packs_to_drop, NULL, flags);
+               result = write_midx_internal(object_dir, NULL, &packs_to_drop, NULL, flags);
                m = NULL;
        }
 
@@ -1851,7 +1892,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
                goto cleanup;
        }
 
-       result = write_midx_internal(object_dir, NULL, NULL, flags);
+       result = write_midx_internal(object_dir, NULL, NULL, NULL, flags);
        m = NULL;
 
 cleanup:
diff --git a/midx.h b/midx.h
index aa3da557bb0ae974f3e686c3f0f018161d854651..3545e327ead49cbe5d85dc4222d2ceff12479f08 100644 (file)
--- a/midx.h
+++ b/midx.h
@@ -2,6 +2,7 @@
 #define MIDX_H
 
 #include "repository.h"
+#include "string-list.h"
 
 struct object_id;
 struct pack_entry;
@@ -62,6 +63,14 @@ int midx_contains_pack(struct multi_pack_index *m, const char *idx_or_pack_name)
 int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local);
 
 int write_midx_file(const char *object_dir, const char *preferred_pack_name, unsigned flags);
+/*
+ * Variant of write_midx_file which writes a MIDX containing only the packs
+ * specified in packs_to_include.
+ */
+int write_midx_file_only(const char *object_dir,
+                        struct string_list *packs_to_include,
+                        const char *preferred_pack_name,
+                        unsigned flags);
 void clear_midx_file(struct repository *r);
 int verify_midx_file(struct repository *r, const char *object_dir, unsigned flags);
 int expire_midx_packs(struct repository *r, const char *object_dir, unsigned flags);