[PATCH] show-branch: color the commit status signs

Subsystems: documentation, the rest

DORMANTno replies

3 messages, 2 authors, 2016-06-15 · open the first message on its own page

[PATCH] show-branch: color the commit status signs

From: Markus Heidelberg <hidden>
Date: 2016-06-15 22:46:38

Make it possible to color the status character ('*' '!' '+' '-') of
commits. Each branch uses a single color. This makes it easier to follow
a particular branch, especially when there are gaps in the output.

Add the config option color.showbranch and the command line options
 --color and --no-color to control the colored output.

Signed-off-by: Markus Heidelberg <redacted>
---

    I will send a patch for bash completion of --[no-]color and
    color.showbranch, when this patch is accepted.

 Documentation/config.txt          |    6 ++++
 Documentation/git-show-branch.txt |    8 ++++++
 builtin-show-branch.c             |   51 ++++++++++++++++++++++++++++++++++---
 3 files changed, 61 insertions(+), 4 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 35056e1..1383a29 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -595,6 +595,12 @@ color.pager::
 	A boolean to enable/disable colored output when the pager is in
 	use (default is true).
 
+color.showbranch::
+	A boolean to enable/disable color in the output of
+	linkgit:git-show-branch[1]. May be set to `always`,
+	`false` (or `never`) or `auto` (or `true`), in which case colors are used
+	only when the output is to a terminal. Defaults to false.
+
 color.status::
 	A boolean to enable/disable color in the output of
 	linkgit:git-status[1]. May be set to `always`,
diff --git a/Documentation/git-show-branch.txt b/Documentation/git-show-branch.txt
index 7e9ff37..1ec3601 100644
--- a/Documentation/git-show-branch.txt
+++ b/Documentation/git-show-branch.txt
@@ -10,6 +10,7 @@ SYNOPSIS
 [verse]
 'git show-branch' [--all] [--remotes] [--topo-order] [--current]
 		[--more=<n> | --list | --independent | --merge-base]
+		[--color | --no-color]
 		[--no-name | --sha1-name] [--topics] [<rev> | <glob>]...
 'git show-branch' (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]
 
@@ -107,6 +108,13 @@ OPTIONS
 	When no explicit <ref> parameter is given, it defaults to the
 	current branch (or `HEAD` if it is detached).
 
+--color::
+	Color the status sign of the commits. Each branch uses a single color.
+
+--no-color::
+	Turn off colored output, even when the configuration file gives the
+	default to color output.
+
 Note that --more, --list, --independent and --merge-base options
 are mutually exclusive.
 
diff --git a/builtin-show-branch.c b/builtin-show-branch.c
index 828e6f8..fc38f5e 100644
--- a/builtin-show-branch.c
+++ b/builtin-show-branch.c
@@ -2,12 +2,25 @@
 #include "commit.h"
 #include "refs.h"
 #include "builtin.h"
+#include "color.h"
 
 static const char show_branch_usage[] =
 "git show-branch [--sparse] [--current] [--all] [--remotes] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...] | --reflog[=n[,b]] <branch>";
 static const char show_branch_usage_reflog[] =
 "--reflog is incompatible with --all, --remotes, --independent or --merge-base";
 
+static int showbranch_use_color = -1;
+static char column_colors[][COLOR_MAXLEN] = {
+	GIT_COLOR_RED,
+	GIT_COLOR_GREEN,
+	GIT_COLOR_YELLOW,
+	GIT_COLOR_BLUE,
+	GIT_COLOR_MAGENTA,
+	GIT_COLOR_CYAN,
+};
+
+#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
+
 static int default_num;
 static int default_alloc;
 static const char **default_arg;
@@ -19,6 +32,20 @@ static const char **default_arg;
 
 #define DEFAULT_REFLOG	4
 
+static const char *get_color_code(int idx)
+{
+	if (showbranch_use_color)
+		return column_colors[idx];
+	return "";
+}
+
+static const char *get_color_reset_code(void)
+{
+	if (showbranch_use_color)
+		return GIT_COLOR_RESET;
+	return "";
+}
+
 static struct commit *interesting(struct commit_list *list)
 {
 	while (list) {
@@ -545,7 +572,12 @@ static int git_show_branch_config(const char *var, const char *value, void *cb)
 		return 0;
 	}
 
-	return git_default_config(var, value, cb);
+	if (!strcmp(var, "color.showbranch")) {
+		showbranch_use_color = git_config_colorbool(var, value, -1);
+		return 0;
+	}
+
+	return git_color_default_config(var, value, cb);
 }
 
 static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
@@ -611,6 +643,9 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 
 	git_config(git_show_branch_config, NULL);
 
+	if (showbranch_use_color == -1)
+		showbranch_use_color = git_use_color_default;
+
 	/* If nothing is specified, try the default first */
 	if (ac == 1 && default_num) {
 		ac = default_num + 1;
@@ -658,6 +693,10 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 			parse_reflog_param(arg + 9, &reflog, &reflog_base);
 		else if (!prefixcmp(arg, "-g="))
 			parse_reflog_param(arg + 3, &reflog, &reflog_base);
+		else if (!strcmp(arg, "--color"))
+			showbranch_use_color = 1;
+		else if (!strcmp(arg, "--no-color"))
+			showbranch_use_color = 0;
 		else
 			usage(show_branch_usage);
 		ac--; av++;
@@ -843,8 +882,10 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 			else {
 				for (j = 0; j < i; j++)
 					putchar(' ');
-				printf("%c [%s] ",
-				       is_head ? '*' : '!', ref_name[i]);
+				printf("%s%c%s [%s] ",
+				       get_color_code(i % COLUMN_COLORS_MAX),
+				       is_head ? '*' : '!',
+				       get_color_reset_code(), ref_name[i]);
 			}
 
 			if (!reflog) {
@@ -903,7 +944,9 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 					mark = '*';
 				else
 					mark = '+';
-				putchar(mark);
+				printf("%s%c%s",
+				       get_color_code(i % COLUMN_COLORS_MAX),
+				       mark, get_color_reset_code());
 			}
 			putchar(' ');
 		}
-- 
1.6.3.rc1.61.ge6ab3

Re: [PATCH] show-branch: color the commit status signs

From: Stephen Boyd <hidden>
Date: 2016-06-15 22:46:38

On Tue, Apr 21, 2009, Markus Heidelberg [off-list ref] wrote:
+--color::
+       Color the status sign of the commits. Each branch uses a single color.
I don't know what the status sign of a commit is without reading your commit
message. Maybe reword this to be:

Color the status sign ('*' '!' '+' '-') of each commit corresponding
to the branch
it's in.
+static char column_colors[][COLOR_MAXLEN] = {
+       GIT_COLOR_RED,
+       GIT_COLOR_GREEN,
+       GIT_COLOR_YELLOW,
+       GIT_COLOR_BLUE,
+       GIT_COLOR_MAGENTA,
+       GIT_COLOR_CYAN,
+};
+
+#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
This looks like a copy/paste (with a small edit) from graph.c so maybe you
want to refactor the original code from graph.c to color.h?

Re: [PATCH] show-branch: color the commit status signs

From: Markus Heidelberg <hidden>
Date: 2016-06-15 22:46:38

Stephen Boyd, 22.04.2009:
On Tue, Apr 21, 2009, Markus Heidelberg [off-list ref] wrote:
quoted
+--color::
+       Color the status sign of the commits. Each branch uses a single color.
I don't know what the status sign of a commit is without reading your commit
message. Maybe reword this to be:

Color the status sign ('*' '!' '+' '-') of each commit corresponding
to the branch
it's in.
I had some problems with finding the right words for the description and
still wasn't satisfied with it. I think your suggestion makes it easier
and will include it.
quoted
+static char column_colors[][COLOR_MAXLEN] = {
+       GIT_COLOR_RED,
+       GIT_COLOR_GREEN,
+       GIT_COLOR_YELLOW,
+       GIT_COLOR_BLUE,
+       GIT_COLOR_MAGENTA,
+       GIT_COLOR_CYAN,
+};
+
+#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
This looks like a copy/paste (with a small edit) from graph.c so maybe you
want to refactor the original code from graph.c to color.h?
How exactly do you think it can be refactored and then combined?

Markus
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help