Code

Make argv_copy support allocating argv members
[tig.git] / tig.c
diff --git a/tig.c b/tig.c
index f842de567b03108f63dbfe44f3ec7af3bed82a9d..1bf95cda407dbcc43715223558e0c38fa20cdda3 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -688,13 +688,15 @@ argv_free(const char *argv[])
        argv[0] = NULL;
 }
 
-static void
-argv_copy(const char *dst[], const char *src[])
+static bool
+argv_copy(const char *dst[], const char *src[], bool allocate)
 {
        int argc;
 
        for (argc = 0; src[argc]; argc++)
-               dst[argc] = src[argc];
+               if (!(dst[argc] = allocate ? strdup(src[argc]) : src[argc]))
+                       return FALSE;
+       return TRUE;
 }
 
 
@@ -748,7 +750,7 @@ static void
 io_prepare(struct io *io, const char *dir, enum io_type type, const char *argv[])
 {
        io_init(io, dir, type);
-       argv_copy(io->argv, argv);
+       argv_copy(io->argv, argv, FALSE);
 }
 
 static bool
@@ -908,12 +910,6 @@ io_run_append(const char **argv, int fd)
        return io_complete(IO_AP, argv, NULL, -1);
 }
 
-static bool
-io_run_rd(struct io *io, const char **argv, const char *dir)
-{
-       return io_format(io, dir, IO_RD, argv, FORMAT_NONE) && io_start(io);
-}
-
 static bool
 io_eof(struct io *io)
 {
@@ -1749,7 +1745,7 @@ add_run_request(enum keymap keymap, int key, int argc, const char **argv)
        req->key = key;
        req->argv[0] = NULL;
 
-       if (!format_argv(req->argv, argv, FORMAT_NONE))
+       if (!argv_copy(req->argv, argv, TRUE))
                return REQ_NONE;
 
        return REQ_NONE + ++run_requests;
@@ -3290,6 +3286,15 @@ prepare_update(struct view *view, const char *argv[], const char *dir)
        return io_format(&view->io, dir, IO_RD, argv, FORMAT_NONE);
 }
 
+static bool
+start_update(struct view *view, const char **argv, const char *dir)
+{
+       if (view->pipe)
+               io_done(view->pipe);
+       return io_format(&view->io, dir, IO_RD, argv, FORMAT_NONE) &&
+              io_start(&view->io);
+}
+
 static bool
 prepare_update_file(struct view *view, const char *name)
 {
@@ -4522,7 +4527,6 @@ tree_read_date(struct view *view, char *text, bool *read_date)
                        "git", "log", "--no-color", "--pretty=raw",
                                "--cc", "--raw", view->id, "--", path, NULL
                };
-               struct io io = {};
 
                if (!view->lines) {
                        tree_entry(view, LINE_TREE_HEAD, opt_path, NULL, NULL);
@@ -4530,13 +4534,11 @@ tree_read_date(struct view *view, char *text, bool *read_date)
                        return TRUE;
                }
 
-               if (!io_run_rd(&io, log_file, opt_cdup)) {
+               if (!start_update(view, log_file, opt_cdup)) {
                        report("Failed to load tree data");
                        return TRUE;
                }
 
-               io_done(view->pipe);
-               view->io = io;
                *read_date = TRUE;
                return FALSE;
 
@@ -4917,7 +4919,7 @@ blame_open(struct view *view)
                };
 
                if (!string_format(path, "%s:%s", opt_ref, opt_file) ||
-                   !io_run_rd(&view->io, blame_cat_file_argv, opt_cdup))
+                   !start_update(view, blame_cat_file_argv, opt_cdup))
                        return FALSE;
        }
 
@@ -5011,18 +5013,15 @@ blame_read_file(struct view *view, const char *line, bool *read_file)
                        "git", "blame", "--incremental",
                                *opt_ref ? opt_ref : "--incremental", "--", opt_file, NULL
                };
-               struct io io = {};
 
                if (view->lines == 0 && !view->prev)
                        die("No blame exist for %s", view->vid);
 
-               if (view->lines == 0 || !io_run_rd(&io, blame_argv, opt_cdup)) {
+               if (view->lines == 0 || !start_update(view, blame_argv, opt_cdup)) {
                        report("Failed to load blame data");
                        return TRUE;
                }
 
-               io_done(view->pipe);
-               view->io = io;
                *read_file = FALSE;
                return FALSE;
 
@@ -5450,7 +5449,7 @@ branch_open(struct view *view)
                        "--simplify-by-decoration", "--all", NULL
        };
 
-       if (!io_run_rd(&view->io, branch_log, NULL)) {
+       if (!start_update(view, branch_log, NULL)) {
                report("Failed to load branch data");
                return TRUE;
        }