};
static int should_include_pack(const struct write_midx_context *ctx,
- const char *file_name)
+ const char *file_name,
+ int exclude_from_midx)
{
- /*
- * 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))
+ if (exclude_from_midx && ctx->m && midx_contains_pack(ctx->m, file_name))
return 0;
- else if (ctx->to_include &&
- !string_list_has_string(ctx->to_include, file_name))
+ if (ctx->to_include && !string_list_has_string(ctx->to_include,
+ file_name))
return 0;
return 1;
}
if (ends_with(file_name, ".idx")) {
display_progress(ctx->progress, ++ctx->pack_paths_checked);
- if (!should_include_pack(ctx, file_name))
+ if (!should_include_pack(ctx, file_name, 1))
return;
ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
uint32_t i;
for (i = 0; i < ctx->m->num_packs; i++) {
+ if (!should_include_pack(ctx, ctx->m->pack_names[i], 0))
+ continue;
+
ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
if (flags & MIDX_WRITE_REV_INDEX || preferred_pack_name) {
die_errno(_("unable to create leading directories of %s"),
midx_name.buf);
- 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.
- */
- ctx.m = lookup_multi_pack_index(the_repository, object_dir);
- }
-
+ ctx.m = lookup_multi_pack_index(the_repository, object_dir);
if (ctx.m && !midx_checksum_valid(ctx.m)) {
warning(_("ignoring existing multi-pack-index; checksum mismatch"));
ctx.m = NULL;
ctx.nr = 0;
ctx.alloc = ctx.m ? ctx.m->num_packs : 16;
ctx.info = NULL;
+ ctx.to_include = packs_to_include;
ALLOC_ARRAY(ctx.info, ctx.alloc);
if (ctx.m && fill_packs_from_midx(&ctx, preferred_pack_name,
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);