[RFC PATCH] midx.c: clean up .rev file
- From
- haoyurenzhuxia@gmail.com <haoyurenzhuxia@gmail.com>
- Date
- Jun 22, 2022, 11:50 UTC
- Message-ID
- <20220622115014.53754-1-haoyurenzhuxia@gmail.com>
From: Xia XiaoWen <haoyurenzhuxia@gmail.com>
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-*.revBut 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.packThis patch resolves this by adding a cleanup handler to the sigchain.
Signed-off-by: Xia XiaoWen <haoyurenzhuxia@gmail.com> --- 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