git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v14 09/16] git-clean: add colors to interactive git-clean

From
Jiang Xin <worldhello.net@gmail.com>
Date
Jun 24, 2013, 15:21 UTC
Message-ID
<9fd387b5ab08a13d37025c4af05639d278520eed.1372087065.git.worldhello.net@gmail.com>
In-Reply-To
<cover.1372087065.git.worldhello.net@gmail.com>

Show header, help, error messages, and prompt in colors for interactive git-clean. Re-use config variables, such as "color.interactive" and "color.interactive.<slot>" for command `git-add--interactive`.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Comments-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 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.<slot>.
 
 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.<slot>::
-	Use customized color for 'git add --interactive'
-	output. `<slot>` 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.<slot>.
+	Use customized color for 'git add --interactive' and 'git clean
+	--interactive' output. `<slot>` 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.<slot>.
 
 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.g41beab0
Previous: Jiang XinNext: Jiang Xin
Message 24 of 33 in “t0060: skip a few relative_path tests on Windows”
  1. t0060: skip a few relative_path tests on WindowsJohannes Sixt, Jun 13, 2013
  2. Jiang XinJun 13, 2013
  3. 00/16 Interactive git-cleanJiang Xin, Jun 24, 2013
  4. 01/16 test: add test cases for relative_pathJiang Xin, Jun 24, 2013
  5. Junio C HamanoJun 24, 2013
  6. Jiang XinJun 25, 2013
  7. Junio C HamanoJun 25, 2013
  8. Jiang XinJun 25, 2013
  9. 02/16 path.c: refactor relative_path(), not only strip prefixJiang Xin, Jun 24, 2013
  10. 03/16 quote.c: remove path_relative, use relative_path insteadJiang Xin, Jun 24, 2013
  11. Junio C HamanoJun 24, 2013
  12. Jiang XinJun 25, 2013
  13. Junio C HamanoJun 25, 2013
  14. 04/16 Refactor quote_path_relative, remove unused paramsJiang Xin, Jun 24, 2013
  15. Junio C HamanoJun 24, 2013
  16. Jiang XinJun 25, 2013
  17. 05/16 Refactor write_name_quoted_relative, remove unused paramsJiang Xin, Jun 24, 2013
  18. Junio C HamanoJun 24, 2013
  19. Jiang XinJun 25, 2013
  20. 06/16 git-clean: refactor git-clean into two phasesJiang Xin, Jun 24, 2013
  21. Junio C HamanoJun 24, 2013
  22. 07/16 git-clean: add support for -i/--interactiveJiang Xin, Jun 24, 2013
  23. 08/16 git-clean: show items of del_list in columnsJiang Xin, Jun 24, 2013
  24. 09/16 git-clean: add colors to interactive git-cleanJiang Xin, Jun 24, 2013
  25. 10/16 git-clean: use a git-add-interactive compatible UIJiang Xin, Jun 24, 2013
  26. 11/16 git-clean: add filter by pattern interactive actionJiang Xin, Jun 24, 2013
  27. 12/16 git-clean: add select by numbers interactive actionJiang Xin, Jun 24, 2013
  28. 13/16 git-clean: add ask each interactive actionJiang Xin, Jun 24, 2013
  29. 14/16 git-clean: add documentation for interactive git-cleanJiang Xin, Jun 24, 2013
  30. 15/16 test: add t7301 for git-clean--interactiveJiang Xin, Jun 24, 2013
  31. 16/16 test: run testcases with POSIX absolute paths on WindowsJiang Xin, Jun 24, 2013
  32. Johannes SixtJun 24, 2013
  33. Jiang XinJun 25, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.