If you have a 256 colors terminal (or one with true color support), then the predefined 12 colors seem limited. On the other hand, you don't want to draw graph lines with every single color in this mode because the two colors could look extremely similar. This option allows you to hand pick the colors you want. Even with standard terminal, if your background color is neither black or white, then the graph line may match your background and become hidden. You can exclude your background color (or simply the colors you hate) with this. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Sounds like the good first step should be something like this instead of jumping straight to generating a new color palette automatically. It's not hard to create a script that generate this config value based on some jump calculation, if you don't want to manually picking colors. Documentation/config.txt | 4 ++++ graph.c | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index d51182a..4f26c2a 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -2033,6 +2033,10 @@ log.follow:: i.e. it cannot be used to follow multiple files and does not work well on non-linear history. +log.graphColors:: + A list of colors, separated by commas, that can be used to draw + history lines in `git log --graph`. + log.showRoot:: If true, the initial commit will be shown as a big creation event. This is equivalent to a diff against an empty tree. diff --git a/graph.c b/graph.c index d4e8519..9c58fd1 100644 --- a/graph.c +++ b/graph.c @@ -79,6 +79,39 @@ static void graph_show_line_prefix(const struct diff_options *diffopt) static const char **column_colors; static unsigned short column_colors_max; +static void set_column_colors_by_config(void) +{ + static char **colors; + static int colors_max, colors_alloc; + char *string = NULL; + const char *end, *start; + + if (git_config_get_string("log.graphcolors", &string)) { + graph_set_column_colors(column_colors_ansi, + column_colors_ansi_max); + return; + } + + start = string; + end = string + strlen(string); + while (start < end) { + const char *comma = strchrnul(start, ','); + char color[COLOR_MAXLEN]; + + if (!color_parse_mem(start, comma - start, color)) { + ALLOC_GROW(colors, colors_max + 1, colors_alloc); + colors[colors_max++] = xstrdup(color); + } else + warning(_("ignore invalid color '%.*s'"), + (int)(comma - start), start); + start = comma + 1; + } + free(string); + ALLOC_GROW(colors, colors_max + 1, colors_alloc); + colors[colors_max] = xstrdup(GIT_COLOR_RESET); + graph_set_column_colors((const char **)colors, colors_max); +} + void graph_set_column_colors(const char **colors, unsigned short colors_max) { column_colors = colors; @@ -239,8 +272,7 @@ 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); + set_column_colors_by_config(); graph->commit = NULL; graph->revs = opt; -- 2.8.2.524.g6ff3d78