Code

Refactor mkauthor from draw_author
[tig.git] / tig.c
diff --git a/tig.c b/tig.c
index fd40b8e98027c3aeac5a9c55a130d902c98e102f..7de7f8603f510cb4e487be33b1c09abbc92c3ff8 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -207,6 +207,20 @@ get_author_initials(const char *author)
        return initials;
 }
 
+#define author_trim(cols) (cols == 0 || cols > 5)
+
+static const char *
+mkauthor(const char *text, int cols, enum author author)
+{
+       bool trim = author_trim(cols);
+       bool abbreviate = author == AUTHOR_ABBREVIATED || !trim;
+
+       if (!author)
+               return "";
+       if (abbreviate && text)
+               return get_author_initials(text);
+       return text;
+}
 
 /*
  * User requests
@@ -1435,6 +1449,7 @@ enum open_flags {
        OPEN_RELOAD = 4,        /* Reload view even if it is the current. */
        OPEN_REFRESH = 16,      /* Refresh view using previous command. */
        OPEN_PREPARED = 32,     /* Open already prepared command. */
+       OPEN_EXTRA = 64,        /* Open extra data from command. */
 };
 
 struct view_ops {
@@ -1653,16 +1668,10 @@ draw_date(struct view *view, struct time *time)
 static bool
 draw_author(struct view *view, const char *author)
 {
-       bool trim = opt_author_cols == 0 || opt_author_cols > 5;
-       bool abbreviate = opt_author == AUTHOR_ABBREVIATED || !trim;
+       bool trim = author_trim(opt_author_cols);
+       const char *text = mkauthor(author, opt_author_cols, opt_author);
 
-       if (opt_author == AUTHOR_NO)
-               return FALSE;
-
-       if (abbreviate && author)
-               author = get_author_initials(author);
-
-       return draw_field(view, LINE_AUTHOR, author, opt_author_cols, trim);
+       return draw_field(view, LINE_AUTHOR, text, opt_author_cols, trim);
 }
 
 static bool
@@ -1710,6 +1719,43 @@ draw_lineno(struct view *view, unsigned int lineno)
        return draw_graphic(view, LINE_DEFAULT, &separator, 1, TRUE);
 }
 
+static bool
+draw_refs(struct view *view, struct ref_list *refs)
+{
+       size_t i;
+
+       if (!opt_show_refs || !refs)
+               return FALSE;
+
+       for (i = 0; i < refs->size; i++) {
+               struct ref *ref = refs->refs[i];
+               enum line_type type;
+
+               if (ref->head)
+                       type = LINE_MAIN_HEAD;
+               else if (ref->ltag)
+                       type = LINE_MAIN_LOCAL_TAG;
+               else if (ref->tag)
+                       type = LINE_MAIN_TAG;
+               else if (ref->tracked)
+                       type = LINE_MAIN_TRACKED;
+               else if (ref->remote)
+                       type = LINE_MAIN_REMOTE;
+               else
+                       type = LINE_MAIN_REF;
+
+               if (draw_text(view, type, "[") ||
+                   draw_text(view, type, ref->name) ||
+                   draw_text(view, type, "]"))
+                       return TRUE;
+
+               if (draw_text(view, LINE_DEFAULT, " "))
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
 static bool
 draw_view_line(struct view *view, unsigned int lineno)
 {
@@ -1977,14 +2023,16 @@ toggle_option(enum request request)
 }
 
 static void
-maximize_view(struct view *view)
+maximize_view(struct view *view, bool redraw)
 {
        memset(display, 0, sizeof(display));
        current_view = 0;
        display[current_view] = view;
        resize_display();
-       redraw_display(FALSE);
-       report("");
+       if (redraw) {
+               redraw_display(FALSE);
+               report("");
+       }
 }
 
 
@@ -2388,7 +2436,7 @@ format_arg(const char *name)
 }
 
 static bool
-format_argv(const char ***dst_argv, const char *src_argv[], bool replace, bool first)
+format_argv(const char ***dst_argv, const char *src_argv[], bool first)
 {
        char buf[SIZEOF_STR];
        int argc;
@@ -2426,7 +2474,7 @@ format_argv(const char ***dst_argv, const char *src_argv[], bool replace, bool f
                        int len = next - arg;
                        const char *value;
 
-                       if (!next || !replace) {
+                       if (!next) {
                                len = strlen(arg);
                                value = "";
 
@@ -2441,7 +2489,7 @@ format_argv(const char ***dst_argv, const char *src_argv[], bool replace, bool f
                        if (!string_format_from(buf, &bufpos, "%.*s%s", len, arg, value))
                                return FALSE;
 
-                       arg = next && replace ? strchr(next, ')') + 1 : NULL;
+                       arg = next ? strchr(next, ')') + 1 : NULL;
                }
 
                if (!argv_append(dst_argv, buf))
@@ -2497,36 +2545,26 @@ setup_update(struct view *view, const char *vid)
        view->start_time = time(NULL);
 }
 
-static bool
-prepare_io(struct view *view, const char *dir, const char *argv[], bool replace)
-{
-       view->dir = dir;
-       return format_argv(&view->argv, argv, replace, !view->prev);
-}
-
-static bool
-start_update(struct view *view, const char **argv, const char *dir)
-{
-       if (view->pipe)
-               io_done(view->pipe);
-       return prepare_io(view, dir, argv, FALSE) &&
-              io_run(&view->io, IO_RD, dir, view->argv);
-}
-
 static bool
 begin_update(struct view *view, const char *dir, const char **argv, enum open_flags flags)
 {
-       bool reload = !!(flags & (OPEN_RELOAD | OPEN_REFRESH | OPEN_PREPARED));
+       bool extra = !!(flags & (OPEN_EXTRA));
+       bool reload = !!(flags & (OPEN_RELOAD | OPEN_REFRESH | OPEN_PREPARED | OPEN_EXTRA));
        bool refresh = flags & (OPEN_REFRESH | OPEN_PREPARED);
 
        if (!reload && !strcmp(view->vid, view->id))
                return TRUE;
 
-       if (view->pipe)
-               end_update(view, TRUE);
+       if (view->pipe) {
+               if (extra)
+                       io_done(view->pipe);
+               else
+                       end_update(view, TRUE);
+       }
 
        if (!refresh) {
-               if (!prepare_io(view, dir, argv, TRUE))
+               view->dir = dir;
+               if (!format_argv(&view->argv, argv, !view->prev))
                        return FALSE;
 
                /* Put the current ref_* value to the view title ref
@@ -2539,11 +2577,9 @@ begin_update(struct view *view, const char *dir, const char **argv, enum open_fl
        if (view->argv && view->argv[0] &&
            !io_run(&view->io, IO_RD, view->dir, view->argv))
                return FALSE;
-       else if (view->argv && !strcmp(view->argv[0], opt_cdup) &&
-                !io_open(&view->io, "%s%s", opt_cdup, view->argv[1]))
-               return FALSE;
 
-       setup_update(view, view->id);
+       if (!extra)
+               setup_update(view, view->id);
 
        return TRUE;
 }
@@ -2715,6 +2751,29 @@ load_view(struct view *view, enum open_flags flags)
 
 #define refresh_view(view) load_view(view, OPEN_REFRESH)
 
+static void
+split_view(struct view *prev, struct view *view)
+{
+       display[1] = view;
+       current_view = 1;
+       view->parent = prev;
+       resize_display();
+
+       if (prev->lineno - prev->offset >= prev->height) {
+               /* Take the title line into account. */
+               int lines = prev->lineno - prev->offset - prev->height + 1;
+
+               /* Scroll the view that was split if the current line is
+                * outside the new limited view. */
+               do_scroll_view(prev, lines);
+       }
+
+       if (view != prev && view_is_displayed(prev)) {
+               /* "Blur" the previous view. */
+               update_view_title(prev);
+       }
+}
+
 static void
 open_view(struct view *prev, enum request request, enum open_flags flags)
 {
@@ -2722,7 +2781,6 @@ open_view(struct view *prev, enum request request, enum open_flags flags)
        bool reload = !!(flags & (OPEN_RELOAD | OPEN_PREPARED));
        struct view *view = VIEW(request);
        int nviews = displayed_views();
-       struct view *base_view = display[0];
 
        assert(flags ^ OPEN_REFRESH);
 
@@ -2737,14 +2795,9 @@ open_view(struct view *prev, enum request request, enum open_flags flags)
        }
 
        if (split) {
-               display[1] = view;
-               current_view = 1;
-               view->parent = prev;
+               split_view(prev, view);
        } else {
-               /* Maximize the current view. */
-               memset(display, 0, sizeof(display));
-               current_view = 0;
-               display[current_view] = view;
+               maximize_view(view, FALSE);
        }
 
        /* No prev signals that this is the first loaded view. */
@@ -2752,26 +2805,6 @@ open_view(struct view *prev, enum request request, enum open_flags flags)
                view->prev = prev;
        }
 
-       /* Resize the view when switching between split- and full-screen,
-        * or when switching between two different full-screen views. */
-       if (nviews != displayed_views() ||
-           (nviews == 1 && base_view != display[0]))
-               resize_display();
-
-       if (split && prev->lineno - prev->offset >= prev->height) {
-               /* Take the title line into account. */
-               int lines = prev->lineno - prev->offset - prev->height + 1;
-
-               /* Scroll the view that was split if the current line is
-                * outside the new limited view. */
-               do_scroll_view(prev, lines);
-       }
-
-       if (prev && view != prev && split && view_is_displayed(prev)) {
-               /* "Blur" the previous view. */
-               update_view_title(prev);
-       }
-
        load_view(view, flags);
 }
 
@@ -2782,7 +2815,9 @@ open_argv(struct view *prev, struct view *view, const char *argv[], const char *
 
        if (view->pipe)
                end_update(view, TRUE);
-       if (!prepare_io(view, dir, argv, FALSE)) {
+       view->dir = dir;
+       
+       if (!argv_copy(&view->argv, argv)) {
                report("Failed to open %s view: %s", view->name, io_strerror(&view->io));
        } else {
                open_view(prev, request, flags | OPEN_PREPARED);
@@ -2792,16 +2827,9 @@ open_argv(struct view *prev, struct view *view, const char *argv[], const char *
 static void
 open_file(struct view *prev, struct view *view, const char *file, enum open_flags flags)
 {
-       enum request request = view - views + REQ_OFFSET + 1;
        const char *file_argv[] = { opt_cdup, file , NULL };
 
-       if (view->pipe)
-               end_update(view, TRUE);
-       if (!argv_copy(&view->argv, file_argv)) {
-               report("Failed to load %s: out of memory", file);
-       } else {
-               open_view(prev, request, flags | OPEN_PREPARED);
-       }
+       open_argv(prev, view, file_argv, opt_cdup, flags); 
 }
 
 static void
@@ -2855,7 +2883,7 @@ open_run_request(enum request request)
                return;
        }
 
-       if (format_argv(&argv, req->argv, TRUE, FALSE))
+       if (format_argv(&argv, req->argv, FALSE))
                open_external_viewer(argv, NULL);
        if (argv)
                argv_free(argv);
@@ -3005,7 +3033,7 @@ view_driver(struct view *view, enum request request)
 
        case REQ_MAXIMIZE:
                if (displayed_views() == 2)
-                       maximize_view(view);
+                       maximize_view(view, TRUE);
                break;
 
        case REQ_OPTIONS:
@@ -3062,7 +3090,7 @@ view_driver(struct view *view, enum request request)
                 * view itself. Parents to closed view should never be
                 * followed. */
                if (view->prev && view->prev != view) {
-                       maximize_view(view->prev);
+                       maximize_view(view->prev, TRUE);
                        view->prev = view;
                        break;
                }
@@ -3727,11 +3755,10 @@ tree_read_date(struct view *view, char *text, bool *read_date)
                return TRUE;
 
        } else if (!text) {
-               char *path = *opt_path ? opt_path : ".";
                /* Find next entry to process */
                const char *log_file[] = {
                        "git", "log", "--no-color", "--pretty=raw",
-                               "--cc", "--raw", view->id, "--", path, NULL
+                               "--cc", "--raw", view->id, "--", "%(directory)", NULL
                };
 
                if (!view->lines) {
@@ -3740,7 +3767,7 @@ tree_read_date(struct view *view, char *text, bool *read_date)
                        return TRUE;
                }
 
-               if (!start_update(view, log_file, opt_cdup)) {
+               if (!begin_update(view, opt_cdup, log_file, OPEN_EXTRA)) {
                        report("Failed to load tree data");
                        return TRUE;
                }
@@ -4115,6 +4142,7 @@ struct blame {
 static bool
 blame_open(struct view *view, enum open_flags flags)
 {
+       const char *file_argv[] = { opt_cdup, opt_file , NULL };
        char path[SIZEOF_STR];
        size_t i;
 
@@ -4124,13 +4152,13 @@ blame_open(struct view *view, enum open_flags flags)
                        return FALSE;
        }
 
-       if (*opt_ref || !io_open(&view->io, "%s%s", opt_cdup, opt_file)) {
+       if (*opt_ref || !begin_update(view, opt_cdup, file_argv, flags)) {
                const char *blame_cat_file_argv[] = {
                        "git", "cat-file", "blob", path, NULL
                };
 
                if (!string_format(path, "%s:%s", opt_ref, opt_file) ||
-                   !start_update(view, blame_cat_file_argv, opt_cdup))
+                   !begin_update(view, opt_cdup, blame_cat_file_argv, flags))
                        return FALSE;
        }
 
@@ -4152,7 +4180,7 @@ blame_open(struct view *view, enum open_flags flags)
                        free(blame->commit);
        }
 
-       setup_update(view, opt_file);
+       string_format(view->vid, "%s:%s", opt_ref, opt_file);
        string_format(view->ref, "%s ...", opt_file);
 
        return TRUE;
@@ -4246,7 +4274,7 @@ blame_read_file(struct view *view, const char *line, bool *read_file)
                if (view->lines == 0 && !view->prev)
                        die("No blame exist for %s", view->vid);
 
-               if (view->lines == 0 || !start_update(view, blame_argv, opt_cdup)) {
+               if (view->lines == 0 || !begin_update(view, opt_cdup, blame_argv, OPEN_EXTRA)) {
                        report("Failed to load blame data");
                        return TRUE;
                }
@@ -4677,12 +4705,11 @@ branch_open(struct view *view, enum open_flags flags)
                        "--simplify-by-decoration", "--all", NULL
        };
 
-       if (!start_update(view, branch_log, NULL)) {
+       if (!begin_update(view, NULL, branch_log, flags)) {
                report("Failed to load branch data");
                return TRUE;
        }
 
-       setup_update(view, view->id);
        branch_open_visitor(view, &branch_all);
        foreach_ref(branch_open_visitor, view);
        view->p_restore = TRUE;
@@ -5812,35 +5839,8 @@ main_draw(struct view *view, struct line *line, unsigned int lineno)
        if (opt_rev_graph && draw_graph(view, &commit->graph))
                return TRUE;
 
-       if (opt_show_refs && commit->refs) {
-               size_t i;
-
-               for (i = 0; i < commit->refs->size; i++) {
-                       struct ref *ref = commit->refs->refs[i];
-                       enum line_type type;
-
-                       if (ref->head)
-                               type = LINE_MAIN_HEAD;
-                       else if (ref->ltag)
-                               type = LINE_MAIN_LOCAL_TAG;
-                       else if (ref->tag)
-                               type = LINE_MAIN_TAG;
-                       else if (ref->tracked)
-                               type = LINE_MAIN_TRACKED;
-                       else if (ref->remote)
-                               type = LINE_MAIN_REMOTE;
-                       else
-                               type = LINE_MAIN_REF;
-
-                       if (draw_text(view, type, "[") ||
-                           draw_text(view, type, ref->name) ||
-                           draw_text(view, type, "]"))
-                               return TRUE;
-
-                       if (draw_text(view, LINE_DEFAULT, " "))
-                               return TRUE;
-               }
-       }
+       if (draw_refs(view, commit->refs))
+               return TRUE;
 
        draw_text(view, LINE_DEFAULT, commit->title);
        return TRUE;
@@ -5940,7 +5940,7 @@ main_request(struct view *view, enum request request, struct line *line)
        switch (request) {
        case REQ_ENTER:
                if (view_is_displayed(view) && display[0] != view)
-                       maximize_view(view);
+                       maximize_view(view, TRUE);
                open_view(view, REQ_VIEW_DIFF, flags);
                break;
        case REQ_REFRESH: