Code

Refactor mkmode from draw_mode
[tig.git] / tig.c
diff --git a/tig.c b/tig.c
index ac053b3510349b777f604a6bf13cb63d986387de..e60b717c90d0d4f9be73f76aee418c214fce4731 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -207,6 +207,38 @@ 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;
+}
+
+static const char *
+mkmode(mode_t mode)
+{
+       if (S_ISDIR(mode))
+               return "drwxr-xr-x";
+       else if (S_ISLNK(mode))
+               return "lrwxrwxrwx";
+       else if (S_ISGITLINK(mode))
+               return "m---------";
+       else if (S_ISREG(mode) && mode & S_IXUSR)
+               return "-rwxr-xr-x";
+       else if (S_ISREG(mode))
+               return "-rw-r--r--";
+       else
+               return "----------";
+}
+
 
 /*
  * User requests
@@ -1654,35 +1686,16 @@ 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
 draw_mode(struct view *view, mode_t mode)
 {
-       const char *str;
-
-       if (S_ISDIR(mode))
-               str = "drwxr-xr-x";
-       else if (S_ISLNK(mode))
-               str = "lrwxrwxrwx";
-       else if (S_ISGITLINK(mode))
-               str = "m---------";
-       else if (S_ISREG(mode) && mode & S_IXUSR)
-               str = "-rwxr-xr-x";
-       else if (S_ISREG(mode))
-               str = "-rw-r--r--";
-       else
-               str = "----------";
+       const char *str = mkmode(mode);
 
        return draw_field(view, LINE_MODE, str, STRING_SIZE("-rw-r--r-- "), FALSE);
 }
@@ -1711,6 +1724,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)
 {
@@ -2500,15 +2550,6 @@ setup_update(struct view *view, const char *vid)
        view->start_time = time(NULL);
 }
 
-static bool
-prepare_update(struct view *view, const char *dir, const char *argv[])
-{
-       if (view->pipe)
-               io_done(view->pipe);
-       view->dir = dir;
-       return argv_copy(&view->argv, argv);
-}
-
 static bool
 begin_update(struct view *view, const char *dir, const char **argv, enum open_flags flags)
 {
@@ -2777,7 +2818,11 @@ open_argv(struct view *prev, struct view *view, const char *argv[], const char *
 {
        enum request request = view - views + REQ_OFFSET + 1;
 
-       if (!prepare_update(view, dir, argv)) {
+       if (view->pipe)
+               end_update(view, TRUE);
+       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);
@@ -2787,17 +2832,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);
-       view->dir = opt_cdup;
-       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
@@ -5807,35 +5844,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;