As a way to troubleshoot unforeseen problems with MIDX files, provide a way to delete "midx-head" and the MIDX it references. Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> --- Documentation/git-midx.txt | 12 +++++++++++- builtin/midx.c | 31 ++++++++++++++++++++++++++++++- t/t5318-midx.sh | 9 +++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/Documentation/git-midx.txt b/Documentation/git-midx.txt index 3eeed1d969..c184d3a593 100644 --- a/Documentation/git-midx.txt +++ b/Documentation/git-midx.txt @@ -9,7 +9,7 @@ git-midx - Write and verify multi-pack-indexes (MIDX files). SYNOPSIS -------- [verse] -'git midx' [--write|--read] <options> [--pack-dir <pack_dir>] +'git midx' [--write|--read|--clear] <options> [--pack-dir <pack_dir>] DESCRIPTION ----------- @@ -22,6 +22,10 @@ OPTIONS Use given directory for the location of packfiles, pack-indexes, and MIDX files. +--clear:: + If specified, delete the midx file specified by midx-head, and + midx-head. (Cannot be combined with --write or --read.) + --read:: If specified, read a midx file specified by the midx-head file and output basic details about the midx file. (Cannot be combined @@ -79,6 +83,12 @@ $ git midx --read $ git midx --read --midx-id 3e50d982a2257168c7fd0ff12ffe5cf6af38c74e -------------------------------------------------------------------- +* Delete the current midx-head and the file it references. ++ +----------------------------------------------- +$ git midx --clear +----------------------------------------------- + CONFIGURATION ------------- diff --git a/builtin/midx.c b/builtin/midx.c index aff2085771..b30ef36ff8 100644 --- a/builtin/midx.c +++ b/builtin/midx.c @@ -11,11 +11,13 @@ static char const * const builtin_midx_usage[] = { N_("git midx [--pack-dir <packdir>]"), N_("git midx --write [--update-head] [--pack-dir <packdir>]"), + N_("git midx --clear [--pack-dir <packdir>]"), NULL }; static struct opts_midx { const char *pack_dir; + int clear; int read; const char *midx_id; int write; @@ -24,6 +26,29 @@ static struct opts_midx { struct object_id old_midx_oid; } opts; +static int midx_clear(void) +{ + struct strbuf head_path = STRBUF_INIT; + char *old_path; + + if (!opts.has_existing) + return 0; + + strbuf_addstr(&head_path, opts.pack_dir); + strbuf_addstr(&head_path, "/"); + strbuf_addstr(&head_path, "midx-head"); + if (remove_path(head_path.buf)) + die("failed to remove path %s", head_path.buf); + strbuf_release(&head_path); + + old_path = get_midx_filename_oid(opts.pack_dir, &opts.old_midx_oid); + if (remove_path(old_path)) + die("failed to remove path %s", old_path); + free(old_path); + + return 0; +} + static int midx_read(void) { struct object_id midx_oid; @@ -263,6 +288,8 @@ int cmd_midx(int argc, const char **argv, const char *prefix) { OPTION_STRING, 'p', "pack-dir", &opts.pack_dir, N_("dir"), N_("The pack directory containing set of packfile and pack-index pairs.") }, + OPT_BOOL('c', "clear", &opts.clear, + N_("clear midx file and midx-head")), OPT_BOOL('r', "read", &opts.read, N_("read midx file")), { OPTION_STRING, 'M', "midx-id", &opts.midx_id, @@ -287,7 +314,7 @@ int cmd_midx(int argc, const char **argv, const char *prefix) builtin_midx_options, builtin_midx_usage, 0); - if (opts.write + opts.read > 1) + if (opts.write + opts.read + opts.clear > 1) usage_with_options(builtin_midx_usage, builtin_midx_options); if (!opts.pack_dir) { @@ -299,6 +326,8 @@ int cmd_midx(int argc, const char **argv, const char *prefix) opts.has_existing = !!get_midx_head_oid(opts.pack_dir, &opts.old_midx_oid); + if (opts.clear) + return midx_clear(); if (opts.read) return midx_read(); if (opts.write) diff --git a/t/t5318-midx.sh b/t/t5318-midx.sh index 2e52389442..9337355ab3 100755 --- a/t/t5318-midx.sh +++ b/t/t5318-midx.sh @@ -143,4 +143,13 @@ test_expect_success 'write-midx in bare repo' \ git midx --read >output && cmp output expect' +test_expect_success 'midx --clear' \ + 'git midx --clear && + test_path_is_missing "${baredir}/midx-${midx4}.midx" && + test_path_is_missing "${baredir}/midx-head" && + cd ../full && + git midx --clear && + test_path_is_missing "${packdir}/midx-${midx4}.midx" && + test_path_is_missing "${packdir}/midx-head"' + test_done -- 2.15.0