From: Xia XiaoWen <haoyurenzhuxia@xxxxxxxxx> The command: `git multi-pack-index write --bitmap` will create 3 files in `objects/pack/`: * multi-pack-index * multi-pack-index-*.bitmap * multi-pack-index-*.rev But if the command is terminated by the user (such as Ctl-C) or the system, the midx reverse index file (`multi-pack-index-*.rev`) is not removed and still exists in `objects/pack/`: $ GIT_TEST_MIDX_WRITE_REV=1 git multi-pack-index write --bitmap Selecting bitmap commits: 133020, done. Building bitmaps: 0% (3/331) ^C^C $ tree objects/pack/ objects/pack/ ├── multi-pack-index-3b048d1b965842cd866e10b6ec1a3035dbede0a5.rev ├── pack-b7d425f1b01727d5f364f5d9fbab2d1900fcd5c0.idx └── pack-b7d425f1b01727d5f364f5d9fbab2d1900fcd5c0.pack This patch resolves this by adding a cleanup handler to the sigchain. Signed-off-by: Xia XiaoWen <haoyurenzhuxia@xxxxxxxxx> --- midx.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/midx.c b/midx.c index 5f0dd386b0..6586051a62 100644 --- a/midx.c +++ b/midx.c @@ -17,6 +17,7 @@ #include "refs.h" #include "revision.h" #include "list-objects.h" +#include "sigchain.h" #define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */ #define MIDX_VERSION 1 @@ -41,6 +42,8 @@ #define PACK_EXPIRED UINT_MAX +static struct strbuf rev_filename = STRBUF_INIT; + const unsigned char *get_midx_checksum(struct multi_pack_index *m) { return m->data + m->data_len - the_hash_algo->rawsz; @@ -884,21 +887,29 @@ static uint32_t *midx_pack_order(struct write_midx_context *ctx) return pack_order; } +static void remove_rev_file_on_signal(int signo) +{ + if (unlink(rev_filename.buf)) + die_errno(_("failed to remove %s"), rev_filename.buf); + + sigchain_pop(signo); + raise(signo); +} + static void write_midx_reverse_index(char *midx_name, unsigned char *midx_hash, struct write_midx_context *ctx) { - struct strbuf buf = STRBUF_INIT; const char *tmp_file; - strbuf_addf(&buf, "%s-%s.rev", midx_name, hash_to_hex(midx_hash)); + strbuf_addf(&rev_filename, "%s-%s.rev", midx_name, hash_to_hex(midx_hash)); tmp_file = write_rev_file_order(NULL, ctx->pack_order, ctx->entries_nr, midx_hash, WRITE_REV); - if (finalize_object_file(tmp_file, buf.buf)) + if (finalize_object_file(tmp_file, rev_filename.buf)) die(_("cannot store reverse index file")); - strbuf_release(&buf); + sigchain_push_common(remove_rev_file_on_signal); } static void clear_midx_files_ext(const char *object_dir, const char *ext, -- 2.34.1.52.g9efd6505a3.dirty.agit.6.5.6