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

Reply via email to