On Mon, Jul 26, 2021 at 02:12:30PM -0400, Taylor Blau wrote: > So we do have to keep it open there. Which makes me wonder how this > could possibly work on Windows, because holding the MIDX open will make > the commit_lock_file() definitely fail. But it seems OK in the > Windows-based CI runs? > > Puzzled. The below should do the trick; it'll keep the MIDX open just long enough to generate a bitmap (if one was requested), but will close any handle(s) on an existing MIDX right before we move the temporary file into place. It has the added benefit of making that hunk about destroying stale references to packs be unnecessary. Watching the Actions run here to see how this runs on Windows: https://github.com/ttaylorr/git/actions/runs/1068457013 Below is the patch. --- >8 --- commit c7b7ce0ebc793e311072929772a2d352600f3d54 Author: Taylor Blau <me@xxxxxxxxxxxx> Date: Mon Jul 26 14:17:27 2021 -0400 fixup! pack-bitmap: write multi-pack bitmaps diff --git a/midx.c b/midx.c index 76c94a0df2..297627f992 100644 --- a/midx.c +++ b/midx.c @@ -1358,6 +1358,8 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index * } } + close_midx(ctx.m); + commit_lock_file(&lk); clear_midx_files_ext(the_repository, ".bitmap", midx_hash); @@ -1368,15 +1370,6 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index * if (ctx.info[i].p) { close_pack(ctx.info[i].p); free(ctx.info[i].p); - if (ctx.m) { - /* - * Destroy a stale reference to the pack in - * 'ctx.m'. - */ - uint32_t orig = ctx.info[i].orig_pack_int_id; - if (orig < ctx.m->num_packs) - ctx.m->packs[orig] = NULL; - } } free(ctx.info[i].pack_name); } @@ -1386,7 +1379,6 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index * free(ctx.pack_perm); free(ctx.pack_order); free(midx_name); - close_midx(ctx.m); return result; }