Merge branch 'ap/branch'
* ap/branch: branch --color: change default color selection. Colourise git-branch output
This commit is contained in:
commit
9b2c681cae
@ -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[] =
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user