Show header, help, error messages, and prompt in colors for interactive
git-clean. Re-use config variables for other git commands, such as
git-add--interactive and git-stash:

 * color.interactive: When set to always, always use colors for
   interactive prompts and displays. When false (or never),
   never. When set to true or auto, use colors only when the
   output is to the terminal.

 * color.interactive.<slot>: Use customized color for interactive
   git-clean output (like git add --interactive). <slot> may be
   prompt, header, help or error.

Signed-off-by: Jiang Xin <worldhello....@gmail.com>
Comments-by: Matthieu Moy <matthieu....@imag.fr>
---
 builtin/clean.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 79 insertions(+), 1 deletion(-)

diff --git a/builtin/clean.c b/builtin/clean.c
index 6ee7..1692b 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -14,6 +14,7 @@
 #include "string-list.h"
 #include "quote.h"
 #include "column.h"
+#include "color.h"
 
 static int force = -1; /* unset */
 static int interactive;
@@ -30,17 +31,82 @@ static const char *msg_skip_git_dir = N_("Skipping 
repository %s\n");
 static const char *msg_would_skip_git_dir = N_("Would skip repository %s\n");
 static const char *msg_warn_remove_failed = N_("failed to remove %s");
 
+static int clean_use_color = -1;
+static char clean_colors[][COLOR_MAXLEN] = {
+       GIT_COLOR_RESET,
+       GIT_COLOR_NORMAL,       /* PLAIN */
+       GIT_COLOR_BOLD_BLUE,    /* PROMPT */
+       GIT_COLOR_BOLD,         /* HEADER */
+       GIT_COLOR_BOLD_RED,     /* HELP */
+       GIT_COLOR_BOLD_RED,     /* ERROR */
+};
+enum color_clean {
+       CLEAN_COLOR_RESET = 0,
+       CLEAN_COLOR_PLAIN = 1,
+       CLEAN_COLOR_PROMPT = 2,
+       CLEAN_COLOR_HEADER = 3,
+       CLEAN_COLOR_HELP = 4,
+       CLEAN_COLOR_ERROR = 5,
+};
+
+static int parse_clean_color_slot(const char *var, int ofs)
+{
+       if (!strcasecmp(var+ofs, "reset"))
+               return CLEAN_COLOR_RESET;
+       if (!strcasecmp(var+ofs, "plain"))
+               return CLEAN_COLOR_PLAIN;
+       if (!strcasecmp(var+ofs, "prompt"))
+               return CLEAN_COLOR_PROMPT;
+       if (!strcasecmp(var+ofs, "header"))
+               return CLEAN_COLOR_HEADER;
+       if (!strcasecmp(var+ofs, "help"))
+               return CLEAN_COLOR_HELP;
+       if (!strcasecmp(var+ofs, "error"))
+               return CLEAN_COLOR_ERROR;
+       return -1;
+}
+
 static int git_clean_config(const char *var, const char *value, void *cb)
 {
        /* honors the column.ui config variable only */
        if (!prefixcmp(var, "column."))
                return git_column_config(var, value, NULL, &colopts);
 
+       /* honors the color.interactive* config variables which also
+          applied in git-add--interactive and git-stash */
+       if (!strcmp(var, "color.interactive")) {
+               clean_use_color = git_config_colorbool(var, value);
+               return 0;
+       }
+       if (!prefixcmp(var, "color.interactive.")) {
+               int slot = parse_clean_color_slot(var, 18);
+               if (slot < 0)
+                       return 0;
+               if (!value)
+                       return config_error_nonbool(var);
+               color_parse(value, var, clean_colors[slot]);
+               return 0;
+       }
+
        if (!strcmp(var, "clean.requireforce")) {
                force = !git_config_bool(var, value);
                return 0;
        }
-       return git_default_config(var, value, cb);
+
+       /* inspect the color.ui config variable and others */
+       return git_color_default_config(var, value, cb);
+}
+
+static const char *clean_get_color(enum color_clean ix)
+{
+       if (want_color(clean_use_color))
+               return clean_colors[ix];
+       return "";
+}
+
+static void clean_print_color(enum color_clean ix)
+{
+       printf("%s", clean_get_color(ix));
 }
 
 static int exclude_cb(const struct option *opt, const char *arg, int unset)
@@ -189,16 +255,20 @@ void interactive_clean_edit(struct string_list *dels, 
const char *prefix)
        int changed = -1, i;
 
        putchar('\n');
+       clean_print_color(CLEAN_COLOR_HELP);
        printf_ln(_(
                    "NOTE: Will remove the following items. You can input 
space-seperated\n"
                    "NOTE: patterns (just like .gitignore) to exclude items 
from deletion,\n"
                    "NOTE: or press ENTER to continue."
                   ));
+       clean_print_color(CLEAN_COLOR_RESET);
 
        while (1) {
                /* dels list may become empty when we run 
string_list_remove_empty_items later */
                if (!dels->nr) {
+                       clean_print_color(CLEAN_COLOR_ERROR);
                        printf_ln(_("No more files to clean, exiting."));
+                       clean_print_color(CLEAN_COLOR_RESET);
                        break;
                }
 
@@ -209,7 +279,9 @@ void interactive_clean_edit(struct string_list *dels, const 
char *prefix)
                        pretty_print_dels(dels, prefix);
                }
 
+               clean_print_color(CLEAN_COLOR_PROMPT);
                printf(_("Input ignore patterns> "));
+               clean_print_color(CLEAN_COLOR_RESET);
                strbuf_getline(&confirm, stdin, '\n');
                strbuf_trim(&confirm);
 
@@ -245,7 +317,9 @@ void interactive_clean_edit(struct string_list *dels, const 
char *prefix)
                if (changed) {
                        string_list_remove_empty_items(dels, 0);
                } else {
+                       clean_print_color(CLEAN_COLOR_ERROR);
                        printf_ln(_("WARNING: Cannot find items matched by: 
%s"), confirm.buf);
+                       clean_print_color(CLEAN_COLOR_RESET);
                }
 
                strbuf_list_free(ignore_list);
@@ -264,19 +338,23 @@ void interactive_clean(struct string_list *dels, const 
char *prefix)
        /* dels list may become empty after return back from edit mode */
        while (dels->nr) {
                putchar('\n');
+               clean_print_color(CLEAN_COLOR_HEADER);
                printf_ln(_(
                            "WARNING: The following items will be removed 
permanently. Press \"y\"\n"
                            "WARNING: to start cleaning, and press \"n\" to 
abort the cleaning.\n"
                            "WARNING: You can also enter the \"edit\" mode, and 
select items\n"
                            "WARNING: to be excluded from the cleaning."
                           ));
+               clean_print_color(CLEAN_COLOR_RESET);
                putchar('\n');
 
                /* Display dels in columns */
                pretty_print_dels(dels, prefix);
 
                /* Confirmation dialog */
+               clean_print_color(CLEAN_COLOR_PROMPT);
                printf(count > 0 ? _("Remove (Yes/no/edit) ? ") : _("Remove 
(yes/no/Edit) ? "));
+               clean_print_color(CLEAN_COLOR_RESET);
                strbuf_getline(&confirm, stdin, '\n');
                strbuf_trim(&confirm);
 
-- 
1.8.3.rc0.364.gc6aefbf

--
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