When there are lots of items to be cleaned, it is hard to see them all
in one screen. Show them in columns instead of in one column will solve
this problem.

Signed-off-by: Jiang Xin <worldhello....@gmail.com>
Comments-by: Matthieu Moy <matthieu....@imag.fr>
---
 Documentation/config.txt |  4 ++++
 builtin/clean.c          | 49 +++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 6e53f..98bfa 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -955,6 +955,10 @@ column.branch::
        Specify whether to output branch listing in `git branch` in columns.
        See `column.ui` for details.
 
+column.clean::
+       Specify whether to output cleaning files in `git clean -i` in columns.
+       See `column.ui` for details.
+
 column.status::
        Specify whether to output untracked files in `git status` in columns.
        See `column.ui` for details.
diff --git a/builtin/clean.c b/builtin/clean.c
index 2f9b9..a16988 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -13,10 +13,12 @@
 #include "refs.h"
 #include "string-list.h"
 #include "quote.h"
+#include "column.h"
 
 static int force = -1; /* unset */
 static int interactive;
 static struct string_list del_list = STRING_LIST_INIT_DUP;
+static unsigned int colopts;
 
 static const char *const builtin_clean_usage[] = {
        N_("git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] 
<paths>..."),
@@ -31,8 +33,13 @@ static const char *msg_warn_remove_failed = N_("failed to 
remove %s");
 
 static int git_clean_config(const char *var, const char *value, void *cb)
 {
-       if (!strcmp(var, "clean.requireforce"))
+       if (!prefixcmp(var, "column."))
+               return git_column_config(var, value, "clean", &colopts);
+
+       if (!strcmp(var, "clean.requireforce")) {
                force = !git_config_bool(var, value);
+               return 0;
+       }
        return git_default_config(var, value, cb);
 }
 
@@ -186,21 +193,46 @@ static const char *path_relative(const char *in, const 
char *prefix)
        return buf;
 }
 
-static void interactive_main_loop(void)
+static void pretty_print_dels(void)
 {
-       struct strbuf confirm = STRBUF_INIT;
-       struct strbuf buf = STRBUF_INIT;
+       struct string_list list = STRING_LIST_INIT_DUP;
        struct string_list_item *item;
+       struct strbuf buf = STRBUF_INIT;
        const char *qname;
+       struct column_options copts;
+
+       for_each_string_list_item(item, &del_list) {
+               qname = quote_path_relative(item->string, -1, &buf, NULL);
+               string_list_append(&list, qname);
+       }
+
+       /*
+        * always enable column display, we only consult column.*
+        * about layout strategy and stuff
+        */
+       colopts = (colopts & ~COL_ENABLE_MASK) | COL_ENABLED;
+       memset(&copts, 0, sizeof(copts));
+       copts.indent = "  ";
+       copts.padding = 2;
+       print_columns(&list, colopts, &copts);
+       putchar('\n');
+       strbuf_release(&buf);
+       string_list_clear(&list, 0);
+}
+
+static void interactive_main_loop(void)
+{
+       struct strbuf confirm = STRBUF_INIT;
 
        while (del_list.nr) {
                putchar('\n');
-               for_each_string_list_item(item, &del_list) {
-                       qname = quote_path_relative(item->string, -1, &buf, 
NULL);
-                       printf(_(msg_would_remove), qname);
-               }
+               printf_ln(Q_("Would remove the following item:",
+                            "Would remove the following items:",
+                            del_list.nr));
                putchar('\n');
 
+               pretty_print_dels();
+
                printf(_("Remove (y/n) ? "));
                if (strbuf_getline(&confirm, stdin, '\n') != EOF) {
                        strbuf_trim(&confirm);
@@ -226,7 +258,6 @@ static void interactive_main_loop(void)
                }
        }
 
-       strbuf_release(&buf);
        strbuf_release(&confirm);
 }
 
-- 
1.8.3.rc1.341.g24a8a0f

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to