From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiang Xin Subject: [PATCH v15 09/16] git-clean: add colors to interactive git-clean Date: Tue, 25 Jun 2013 23:53:50 +0800 Message-ID: <021a5dc806aa4f9c74a5c28dac2c39e47622878f.1372175283.git.worldhello.net@gmail.com> References: Cc: Git List , Jiang Xin To: Junio C Hamano , Johannes Sixt X-From: git-owner@vger.kernel.org Tue Jun 25 17:55:02 2013 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UrVa3-00045v-SP for gcvg-git-2@plane.gmane.org; Tue, 25 Jun 2013 17:54:56 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752524Ab3FYPys (ORCPT ); Tue, 25 Jun 2013 11:54:48 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:44461 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751242Ab3FYPyq (ORCPT ); Tue, 25 Jun 2013 11:54:46 -0400 Received: by mail-pb0-f46.google.com with SMTP id rq2so12842072pbb.19 for ; Tue, 25 Jun 2013 08:54:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=p/E9nQhs/n19c9aYoby9CNU9fL3RPhsvgCGaWPWnJmQ=; b=jHY4UhRKr5sCcGjWgdTwT5KGq8LFKzHnRqHXXGZlSDP/H7Ko6xVqBkajiexIzkK3lV oMygXFVByEfajDgUDp2FbizLVTKSLHIdHc2pH674NZvtvXs9OCp7+9TOmPbqqWtDdO4U /PGTIHRmTcnjeYpxDRbY+TbPyir2O/+k8Wc/+XAae8giv2IiPbmXWdxpRhIV2BL5R4ZH wbu5S241qHdMyRbV38MYMRUnFyd6nA4QCSoSD0kqH110i6TYMWmpvPuMB6pCUKrnM4c9 z0zOCwCCNQiLDftwe/cE/D2/ben1qbo4Pli7BbVVY2T3p2JqV7ExzYgUEpGI60LE9EG/ C56Q== X-Received: by 10.68.223.34 with SMTP id qr2mr21479108pbc.75.1372175686381; Tue, 25 Jun 2013 08:54:46 -0700 (PDT) Received: from localhost.localdomain ([114.248.133.39]) by mx.google.com with ESMTPSA id pb5sm23760930pbc.29.2013.06.25.08.54.42 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 25 Jun 2013 08:54:45 -0700 (PDT) X-Mailer: git-send-email 1.8.3.1.756.g2e9b71f In-Reply-To: In-Reply-To: References: Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: Show header, help, error messages, and prompt in colors for interactive git-clean. Re-use config variables, such as "color.interactive" and "color.interactive." for command `git-add--interactive`. Signed-off-by: Jiang Xin Comments-by: Matthieu Moy Signed-off-by: Junio C Hamano --- Documentation/config.txt | 17 +++++------ builtin/clean.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 9 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index c415f..1b31f 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -879,16 +879,17 @@ The values of these variables may be specified as in color.branch.. color.interactive:: When set to `always`, always use colors for interactive prompts - and displays (such as those used by "git-add --interactive"). - When false (or `never`), never. When set to `true` or `auto`, use - colors only when the output is to the terminal. Defaults to false. + and displays (such as those used by "git-add --interactive" and + "git-clean --interactive"). When false (or `never`), never. + When set to `true` or `auto`, use colors only when the output is + to the terminal. Defaults to false. color.interactive.:: - Use customized color for 'git add --interactive' - output. `` may be `prompt`, `header`, `help` or `error`, for - four distinct types of normal output from interactive - commands. The values of these variables may be specified as - in color.branch.. + Use customized color for 'git add --interactive' and 'git clean + --interactive' output. `` may be `prompt`, `header`, `help` + or `error`, for four distinct types of normal output from + interactive commands. The values of these variables may be + specified as in color.branch.. color.pager:: A boolean to enable/disable colored output when the pager is in diff --git a/builtin/clean.c b/builtin/clean.c index 75cc6..dfa99b 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; @@ -31,16 +32,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) +{ + if (!strcasecmp(var, "reset")) + return CLEAN_COLOR_RESET; + if (!strcasecmp(var, "plain")) + return CLEAN_COLOR_PLAIN; + if (!strcasecmp(var, "prompt")) + return CLEAN_COLOR_PROMPT; + if (!strcasecmp(var, "header")) + return CLEAN_COLOR_HEADER; + if (!strcasecmp(var, "help")) + return CLEAN_COLOR_HELP; + if (!strcasecmp(var, "error")) + return CLEAN_COLOR_ERROR; + return -1; +} + static int git_clean_config(const char *var, const char *value, void *cb) { if (!prefixcmp(var, "column.")) return git_column_config(var, value, "clean", &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 + + strlen("color.interactive.")); + 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) @@ -184,14 +251,18 @@ static void interactive_main_loop(void) while (del_list.nr) { putchar('\n'); + clean_print_color(CLEAN_COLOR_HEADER); printf_ln(Q_("Would remove the following item:", "Would remove the following items:", del_list.nr)); + clean_print_color(CLEAN_COLOR_RESET); putchar('\n'); pretty_print_dels(); + clean_print_color(CLEAN_COLOR_PROMPT); printf(_("Remove [y/n]? ")); + clean_print_color(CLEAN_COLOR_RESET); if (strbuf_getline(&confirm, stdin, '\n') != EOF) { strbuf_trim(&confirm); } else { -- 1.8.3.1.756.g2e9b71f