Re: [tig] [PATCHv2 3/3] log: Colour the diff stat
To
Kumar Appaiah
Cc
git
From
Jonas Fonseca
See Also
Prev Ref 1 Ref 2
Date
2014-04-17 00:44:41 UTC
On Sun, Apr 13, 2014 at 5:54 PM, Kumar Appaiah
<a.kumar@alumni.iitm.ac.in> wrote:
>
> This commit adds custom log_read and log_draw functions that utilize
> the diff stat drawing functions from the diff module. The absence of
> the triple hyphen separator prevents direct usage of the diff drawing
> functions directly.

See my comments below.

> ---
>  src/log.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 53 insertions(+), 2 deletions(-)
>
> diff --git a/src/log.c b/src/log.c
> index 40c9a21..468f7c3 100644
> --- a/src/log.c
> +++ b/src/log.c
> @@ -23,6 +23,9 @@ struct log_state {
>          * up/down in the log view. */
>         int last_lineno;
>         enum line_type last_type;
> +       bool commit_title_read;
> +       bool after_commit_header;
> +       bool reading_diff_stat;
>  };
>
>  static void
> @@ -78,14 +81,62 @@ log_request(struct view *view, enum request request, struct line *line)
>         }
>  }
>
> +static bool
> +log_read(struct view *view, char *data)
> +{
> +       enum line_type type;
> +       struct log_state *state = view->private;
> +       size_t len;
> +
> +       if (!data)
> +               return TRUE;
> +
> +       type = get_line_type(data);
> +       len = strlen(data);
> +
> +       if (type == LINE_COMMIT)
> +               state->commit_title_read = TRUE;
> +       else if (state->commit_title_read && len < 1) {
> +               state->commit_title_read = FALSE;
> +               state->after_commit_header = TRUE;
> +       } else if (state->after_commit_header && len < 1) {
> +               state->after_commit_header = FALSE;
> +               state->reading_diff_stat = TRUE;
> +       } else if (state->reading_diff_stat) {
> +               bool ret = diff_common_add_diff_stat(view, data);
> +               if (ret) {
> +                       return TRUE;
> +               } else {
> +                       state->reading_diff_stat = FALSE;
> +               }
> +       }
> +
> +       return pager_common_read(view, data, type);
> +}
> +
> +static bool
> +log_draw(struct view *view, struct line *line, unsigned int lineno)
> +{
> +       char *text = line->data;
> +       enum line_type type = line->type;
> +

This is missing a call to draw_lineno(...)

> +       if (type == LINE_DIFF_STAT) {
> +               diff_common_draw_diff_stat(view, &type, &text);
> +               draw_text(view, type, text);

I had to #include "tig/draw.h" for this to compile.

> +               return TRUE;
> +       }
> +
> +       return pager_draw(view, line, lineno);
> +}
> +
>  static struct view_ops log_ops = {
>         "line",
>         argv_env.head,
>         VIEW_ADD_PAGER_REFS | VIEW_OPEN_DIFF | VIEW_SEND_CHILD_ENTER | VIEW_LOG_LIKE | VIEW_REFRESH,
>         sizeof(struct log_state),
>         log_open,
> -       pager_read,
> -       pager_draw,
> +       log_read,
> +       log_draw,
>         log_request,
>         pager_grep,
>         log_select,
> --
> 1.9.1
>



-- 
Jonas Fonseca