提交 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 @@
* Based on git-branch.sh by Junio C Hamano.
*/
#include "color.h"
#include "cache.h"
#include "refs.h"
#include "commit.h"
......@@ -17,6 +18,58 @@ static const char builtin_branch_usage[] =
static const char *head;
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,
struct commit *rev1,
struct commit *rev2)
......@@ -183,6 +236,7 @@ static void print_ref_list(int kinds, int verbose, int abbrev)
int i;
char c;
struct ref_list ref_list;
int color;
memset(&ref_list, 0, sizeof(ref_list));
ref_list.kinds = kinds;
......@@ -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);
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 = ' ';
if (ref_list.list[i].kind == REF_LOCAL_BRANCH &&
!strcmp(ref_list.list[i].name, head))
!strcmp(ref_list.list[i].name, head)) {
c = '*';
color = COLOR_BRANCH_CURRENT;
}
if (verbose) {
printf("%c %-*s", c, ref_list.maxwidth,
ref_list.list[i].name);
printf("%c %s%-*s%s", c,
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);
}
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);
......@@ -253,7 +327,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
int kinds = REF_LOCAL_BRANCH;
int i;
git_config(git_default_config);
git_config(git_branch_config);
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
......@@ -297,6 +371,14 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
verbose = 1;
continue;
}
if (!strcmp(arg, "--color")) {
branch_use_color = 1;
continue;
}
if (!strcmp(arg, "--no-color")) {
branch_use_color = 0;
continue;
}
usage(builtin_branch_usage);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册