On Thu, Jan 19, 2017 at 06:41:23PM +0700, Nguyễn Thái Ngọc Duy wrote:
> +static void parse_graph_colors_config(struct argv_array *colors, const char
> *string)
> +{
> + const char *end, *start;
> +
> + 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))
> + argv_array_push(colors, color);
> + else
> + warning(_("ignore invalid color '%.*s' in
> log.graphColors"),
> + (int)(comma - start), start);
> + start = comma + 1;
> + }
> + argv_array_push(colors, GIT_COLOR_RESET);
> +}
This looks good.
> @@ -207,9 +228,24 @@ 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);
> + if (!column_colors) {
> + struct argv_array ansi_colors = {
> + column_colors_ansi,
> + column_colors_ansi_max + 1
> + };
Hrm. At first I thought this would cause memory corrution, because your
argv_array_clear() would try to free() the non-heap array you've stuffed
inside. But you only clear the custom_colors array which actually is
dynamically allocated. This outer one is just here to give uniform
access:
> + struct argv_array *colors = &ansi_colors;
> + char *string;
> +
> + if (!git_config_get_string("log.graphcolors", &string)) {
> + static struct argv_array custom_colors =
> ARGV_ARRAY_INIT;
> + argv_array_clear(&custom_colors);
> + parse_graph_colors_config(&custom_colors, string);
> + free(string);
> + colors = &custom_colors;
> + }
> + /* graph_set_column_colors takes a max-index, not a count */
> + graph_set_column_colors(colors->argv, colors->argc - 1);
> + }
Since there's only one line that cares about the result of "colors",
maybe it would be less confusing to do:
if (!git_config_get-string("log.graphcolors", &string)) {
... parse, etc ...
graph_set_column_colors(colors.argv, colors.argc - 1);
} else {
graph_set_column_colors(column_colors_ansi,
column_colors_ansi_max);
}
-Peff