index c1e527083372f3cddca17f6263ee3072a702baf9..7de7f8603f510cb4e487be33b1c09abbc92c3ff8 100644 (file)
--- a/tig.c
+++ b/tig.c
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
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 {
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;
+ bool trim = author_trim(opt_author_cols);
+ const char *text = mkauthor(author, opt_author_cols, opt_author);
- 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
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)
{
}
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 +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 = "";
@@ -2443,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))
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)
{
- 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) {
view->dir = dir;
- if (!format_argv(&view->argv, argv, TRUE, !view->prev))
+ if (!format_argv(&view->argv, argv, !view->prev))
return FALSE;
/* Put the current ref_* value to the view title ref
@@ -2542,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;
}
@@ -2780,7 +2813,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);
@@ -2790,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
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);
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) {
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;
}
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;
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;
}
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;
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;
}
"--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;
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;