Code

Accept 'utf-8' for the line-graphics option as indicated in the docs
[tig.git] / tig.c
diff --git a/tig.c b/tig.c
index f562218376a5f17edc4722ce7e2fb25b4b985ec5..51c84b8a936d713fbbd987764055c1f5dce9d7cd 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -64,14 +64,14 @@ static bool prompt_menu(const char *prompt, const struct menu_item *items, int *
 enum graphic {
        GRAPHIC_ASCII = 0,
        GRAPHIC_DEFAULT,
-       GRAPHIC_UTF8
+       GRAPHIC_UTF_8
 };
 
 static const struct enum_map graphic_map[] = {
 #define GRAPHIC_(name) ENUM_MAP(#name, GRAPHIC_##name)
        GRAPHIC_(ASCII),
        GRAPHIC_(DEFAULT),
-       GRAPHIC_(UTF8)
+       GRAPHIC_(UTF_8)
 #undef GRAPHIC_
 };
 
@@ -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
@@ -1483,7 +1515,7 @@ static struct view views[] = {
        VIEW_(BRANCH, "branch", &branch_ops, TRUE,  ref_head),
        VIEW_(HELP,   "help",   &help_ops,   FALSE, ""),
        VIEW_(PAGER,  "pager",  &pager_ops,  FALSE, ""),
-       VIEW_(STATUS, "status", &status_ops, TRUE,  ""),
+       VIEW_(STATUS, "status", &status_ops, TRUE,  "status"),
        VIEW_(STAGE,  "stage",  &stage_ops,  TRUE,  ""),
 };
 
@@ -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;
-
-       if (opt_author == AUTHOR_NO)
-               return FALSE;
-
-       if (abbreviate && author)
-               author = get_author_initials(author);
+       bool trim = author_trim(opt_author_cols);
+       const char *text = mkauthor(author, opt_author_cols, opt_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,22 +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
-start_update(struct view *view, const char **argv, const char *dir)
-{
-       return prepare_update(view, dir, argv) &&
-              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)
 {
@@ -2784,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);
@@ -2794,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
@@ -3730,11 +3760,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) {
@@ -3743,7 +3772,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;
                }
@@ -4681,12 +4710,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;
@@ -5816,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;