提交 9b2c681c 编写于 作者: J Junio C Hamano

Merge branch 'ap/branch'

* ap/branch:
  branch --color: change default color selection.
  Colourise git-branch output
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* Based on git-branch.sh by Junio C Hamano. * Based on git-branch.sh by Junio C Hamano.
*/ */
#include "color.h"
#include "cache.h" #include "cache.h"
#include "refs.h" #include "refs.h"
#include "commit.h" #include "commit.h"
...@@ -17,6 +18,58 @@ static const char builtin_branch_usage[] = ...@@ -17,6 +18,58 @@ static const char builtin_branch_usage[] =
static const char *head; static const char *head;
static unsigned char head_sha1[20]; static unsigned char head_sha1[20];
static int branch_use_color;
static char branch_colors[][COLOR_MAXLEN] = {
"\033[m", /* reset */
"", /* PLAIN (normal) */
"\033[31m", /* REMOTE (red) */
"", /* LOCAL (normal) */
"\033[32m", /* CURRENT (green) */
};
enum color_branch {
COLOR_BRANCH_RESET = 0,
COLOR_BRANCH_PLAIN = 1,
COLOR_BRANCH_REMOTE = 2,
COLOR_BRANCH_LOCAL = 3,
COLOR_BRANCH_CURRENT = 4,
};
static int parse_branch_color_slot(const char *var, int ofs)
{
if (!strcasecmp(var+ofs, "plain"))
return COLOR_BRANCH_PLAIN;
if (!strcasecmp(var+ofs, "reset"))
return COLOR_BRANCH_RESET;
if (!strcasecmp(var+ofs, "remote"))
return COLOR_BRANCH_REMOTE;
if (!strcasecmp(var+ofs, "local"))
return COLOR_BRANCH_LOCAL;
if (!strcasecmp(var+ofs, "current"))
return COLOR_BRANCH_CURRENT;
die("bad config variable '%s'", var);
}
int git_branch_config(const char *var, const char *value)
{
if (!strcmp(var, "color.branch")) {
branch_use_color = git_config_colorbool(var, value);
return 0;
}
if (!strncmp(var, "color.branch.", 13)) {
int slot = parse_branch_color_slot(var, 13);
color_parse(value, var, branch_colors[slot]);
return 0;
}
return git_default_config(var, value);
}
const char *branch_get_color(enum color_branch ix)
{
if (branch_use_color)
return branch_colors[ix];
return "";
}
static int in_merge_bases(const unsigned char *sha1, static int in_merge_bases(const unsigned char *sha1,
struct commit *rev1, struct commit *rev1,
struct commit *rev2) struct commit *rev2)
...@@ -183,6 +236,7 @@ static void print_ref_list(int kinds, int verbose, int abbrev) ...@@ -183,6 +236,7 @@ static void print_ref_list(int kinds, int verbose, int abbrev)
int i; int i;
char c; char c;
struct ref_list ref_list; struct ref_list ref_list;
int color;
memset(&ref_list, 0, sizeof(ref_list)); memset(&ref_list, 0, sizeof(ref_list));
ref_list.kinds = kinds; ref_list.kinds = kinds;
...@@ -191,18 +245,38 @@ static void print_ref_list(int kinds, int verbose, int abbrev) ...@@ -191,18 +245,38 @@ static void print_ref_list(int kinds, int verbose, int abbrev)
qsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp); qsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp);
for (i = 0; i < ref_list.index; i++) { for (i = 0; i < ref_list.index; i++) {
switch( ref_list.list[i].kind ) {
case REF_LOCAL_BRANCH:
color = COLOR_BRANCH_LOCAL;
break;
case REF_REMOTE_BRANCH:
color = COLOR_BRANCH_REMOTE;
break;
default:
color = COLOR_BRANCH_PLAIN;
break;
}
c = ' '; c = ' ';
if (ref_list.list[i].kind == REF_LOCAL_BRANCH && if (ref_list.list[i].kind == REF_LOCAL_BRANCH &&
!strcmp(ref_list.list[i].name, head)) !strcmp(ref_list.list[i].name, head)) {
c = '*'; c = '*';
color = COLOR_BRANCH_CURRENT;
}
if (verbose) { if (verbose) {
printf("%c %-*s", c, ref_list.maxwidth, printf("%c %s%-*s%s", c,
ref_list.list[i].name); branch_get_color(color),
ref_list.maxwidth,
ref_list.list[i].name,
branch_get_color(COLOR_BRANCH_RESET));
print_ref_info(ref_list.list[i].sha1, abbrev); print_ref_info(ref_list.list[i].sha1, abbrev);
} }
else else
printf("%c %s\n", c, ref_list.list[i].name); printf("%c %s%s%s\n", c,
branch_get_color(color),
ref_list.list[i].name,
branch_get_color(COLOR_BRANCH_RESET));
} }
free_ref_list(&ref_list); free_ref_list(&ref_list);
...@@ -253,7 +327,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) ...@@ -253,7 +327,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
int kinds = REF_LOCAL_BRANCH; int kinds = REF_LOCAL_BRANCH;
int i; int i;
git_config(git_default_config); git_config(git_branch_config);
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
const char *arg = argv[i]; const char *arg = argv[i];
...@@ -297,6 +371,14 @@ int cmd_branch(int argc, const char **argv, const char *prefix) ...@@ -297,6 +371,14 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
verbose = 1; verbose = 1;
continue; continue;
} }
if (!strcmp(arg, "--color")) {
branch_use_color = 1;
continue;
}
if (!strcmp(arg, "--no-color")) {
branch_use_color = 0;
continue;
}
usage(builtin_branch_usage); usage(builtin_branch_usage);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册