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.

Signed-Off-By: Kumar Appaiah <a.ku...@alumni.iitm.ac.in>
---
 src/log.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 60 insertions(+), 2 deletions(-)

diff --git a/src/log.c b/src/log.c
index eef61dc..e6f2a82 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
@@ -76,14 +79,69 @@ 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;
+
+       if (draw_lineno(view, lineno))
+               return TRUE;
+
+       if (line->wrapped && draw_text(view, LINE_DELIMITER, "+"))
+               return TRUE;
+
+       if (type == LINE_DIFF_STAT) {
+               diff_common_draw_diff_stat(view, &type, &text);
+               draw_text(view, type, text);
+               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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to