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 <dsto...@microsoft.com>
---
 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

Reply via email to