Code

Fix blame view regression
[tig.git] / tig.c
diff --git a/tig.c b/tig.c
index 16cfaa294815989412368ae3c91759a066c671de..f562218376a5f17edc4722ce7e2fb25b4b985ec5 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -1435,6 +1435,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 {
@@ -2390,7 +2391,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 +2429,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 +2444,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))
@@ -2500,35 +2501,41 @@ setup_update(struct view *view, const char *vid)
 }
 
 static bool
-prepare_io(struct view *view, const char *dir, const char *argv[], bool replace)
+prepare_update(struct view *view, const char *dir, const char *argv[])
 {
+       if (view->pipe)
+               io_done(view->pipe);
        view->dir = dir;
-       return format_argv(&view->argv, argv, replace, !view->prev);
+       return argv_copy(&view->argv, argv);
 }
 
 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) &&
+       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) {
-               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 +2548,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;
 }
@@ -2779,9 +2784,7 @@ open_argv(struct view *prev, struct view *view, const char *argv[], const char *
 {
        enum request request = view - views + REQ_OFFSET + 1;
 
-       if (view->pipe)
-               end_update(view, TRUE);
-       if (!prepare_io(view, dir, argv, FALSE)) {
+       if (!prepare_update(view, dir, argv)) {
                report("Failed to open %s view: %s", view->name, io_strerror(&view->io));
        } else {
                open_view(prev, request, flags | OPEN_PREPARED);
@@ -2796,6 +2799,7 @@ open_file(struct view *prev, struct view *view, const char *file, enum open_flag
 
        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 {
@@ -2854,7 +2858,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);
@@ -4114,6 +4118,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 +4128,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 +4156,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 +4250,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;
                }