Enable custom schemes for column colors in the graph API

Currently, the graph code is hardcoded to use ANSI color escapes for
coloring the column characters in the generated graphs. This patch
allows a custom scheme of colors to be set at runtime, allowing
different types of color escapes to be used.

A new function - graph_set_column_colors() - is added to the graph.h API,
which allows a custom column_colors array (and column_colors_max value)
to replace the builtin ANSI array (and _max value). The new function -
if used - must be called before graph_init() is called.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johan Herland 2010-07-13 23:23:39 +02:00 коммит произвёл Junio C Hamano
Родитель 6bdc17d9a6
Коммит 1e3d4119d2
2 изменённых файлов: 43 добавлений и 11 удалений

37
graph.c
Просмотреть файл

@ -62,7 +62,7 @@ enum graph_state {
/*
* The list of available column colors.
*/
static char column_colors[][COLOR_MAXLEN] = {
static const char *column_colors_ansi[] = {
GIT_COLOR_RED,
GIT_COLOR_GREEN,
GIT_COLOR_YELLOW,
@ -75,23 +75,33 @@ static char column_colors[][COLOR_MAXLEN] = {
GIT_COLOR_BOLD_BLUE,
GIT_COLOR_BOLD_MAGENTA,
GIT_COLOR_BOLD_CYAN,
GIT_COLOR_RESET,
};
#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
#define COLUMN_COLORS_ANSI_MAX (ARRAY_SIZE(column_colors_ansi) - 1)
static const char *column_get_color_code(const struct column *c)
static const char **column_colors;
static unsigned short column_colors_max;
void graph_set_column_colors(const char **colors, unsigned short colors_max)
{
return column_colors[c->color];
column_colors = colors;
column_colors_max = colors_max;
}
static const char *column_get_color_code(unsigned short color)
{
return column_colors[color];
}
static void strbuf_write_column(struct strbuf *sb, const struct column *c,
char col_char)
{
if (c->color < COLUMN_COLORS_MAX)
strbuf_addstr(sb, column_get_color_code(c));
if (c->color < column_colors_max)
strbuf_addstr(sb, column_get_color_code(c->color));
strbuf_addch(sb, col_char);
if (c->color < COLUMN_COLORS_MAX)
strbuf_addstr(sb, GIT_COLOR_RESET);
if (c->color < column_colors_max)
strbuf_addstr(sb, column_get_color_code(column_colors_max));
}
struct git_graph {
@ -215,6 +225,11 @@ static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void
struct git_graph *graph_init(struct rev_info *opt)
{
struct git_graph *graph = xmalloc(sizeof(struct git_graph));
if (!column_colors)
graph_set_column_colors(column_colors_ansi,
COLUMN_COLORS_ANSI_MAX);
graph->commit = NULL;
graph->revs = opt;
graph->num_parents = 0;
@ -231,7 +246,7 @@ struct git_graph *graph_init(struct rev_info *opt)
* always increment it for the first commit we output.
* This way we start at 0 for the first commit.
*/
graph->default_column_color = COLUMN_COLORS_MAX - 1;
graph->default_column_color = column_colors_max - 1;
/*
* Allocate a reasonably large default number of columns
@ -354,7 +369,7 @@ static struct commit_list *first_interesting_parent(struct git_graph *graph)
static unsigned short graph_get_current_column_color(const struct git_graph *graph)
{
if (!DIFF_OPT_TST(&graph->revs->diffopt, COLOR_DIFF))
return COLUMN_COLORS_MAX;
return column_colors_max;
return graph->default_column_color;
}
@ -364,7 +379,7 @@ static unsigned short graph_get_current_column_color(const struct git_graph *gra
static void graph_increment_column_color(struct git_graph *graph)
{
graph->default_column_color = (graph->default_column_color + 1) %
COLUMN_COLORS_MAX;
column_colors_max;
}
static unsigned short graph_find_commit_color(const struct git_graph *graph,

17
graph.h
Просмотреть файл

@ -4,6 +4,23 @@
/* A graph is a pointer to this opaque structure */
struct git_graph;
/*
* Set up a custom scheme for column colors.
*
* The default column color scheme inserts ANSI color escapes to colorize
* the graph. The various color escapes are stored in an array of strings
* where each entry corresponds to a color, except for the last entry,
* which denotes the escape for resetting the color back to the default.
* When generating the graph, strings from this array are inserted before
* and after the various column characters.
*
* This function allows you to enable a custom array of color escapes.
* The 'colors_max' argument is the index of the last "reset" entry.
*
* This functions must be called BEFORE graph_init() is called.
*/
void graph_set_column_colors(const char **colors, unsigned short colors_max);
/*
* Create a new struct git_graph.
*/