X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=tig.c;h=eec5b0abfcd7b3a274d67ec88b64b175db487dfb;hb=9cfde756a1a73f275dff97827d35ac27c5eb30eb;hp=16cfaa294815989412368ae3c91759a066c671de;hpb=16f9664dc3626f0f30f6a680913e93b104cccca1;p=tig.git diff --git a/tig.c b/tig.c index 16cfaa2..eec5b0a 100644 --- 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 @@ -1435,6 +1467,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 { @@ -1482,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, ""), }; @@ -1653,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); } @@ -1710,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) { @@ -2390,7 +2441,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; @@ -2428,7 +2479,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 = ""; @@ -2443,7 +2494,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)) @@ -2499,36 +2550,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 @@ -2541,11 +2582,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; } @@ -2781,7 +2820,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); @@ -2791,16 +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); - 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 @@ -2854,7 +2888,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); @@ -3726,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) { @@ -3739,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; } @@ -4114,6 +4147,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; @@ -4123,13 +4157,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; } @@ -4151,7 +4185,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; @@ -4245,7 +4279,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; } @@ -4676,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; @@ -5811,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;