Code

argv: remove now unused FORMAT_DASH
[tig.git] / tig.c
diff --git a/tig.c b/tig.c
index ccd810d85d8c64bc9e500cef647351d63ba23ca4..cd3428cc38c29f783bdbc12800f3dd5ad26d86bf 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -68,8 +68,6 @@
 static void __NORETURN die(const char *err, ...);
 static void warn(const char *msg, ...);
 static void report(const char *msg, ...);
-static size_t utf8_length(const char **start, size_t skip, int *width, size_t max_width, int *trimmed, bool reserve, int tab_size);
-static inline unsigned char utf8_char_length(const char *string, const char *end);
 
 #define ABS(x)         ((x) >= 0  ? (x) : -(x))
 #define MIN(x, y)      ((x) < (y) ? (x) :  (y))
@@ -144,7 +142,6 @@ static int load_refs(void);
 
 enum format_flags {
        FORMAT_ALL,             /* Perform replacement in all arguments. */
-       FORMAT_DASH,            /* Perform replacement up until "--". */
        FORMAT_NONE             /* No replacement should be performed. */
 };
 
@@ -359,6 +356,166 @@ suffixcmp(const char *str, int slen, const char *suffix)
 }
 
 
+/*
+ * Unicode / UTF-8 handling
+ *
+ * NOTE: Much of the following code for dealing with Unicode is derived from
+ * ELinks' UTF-8 code developed by Scrool <scroolik@gmail.com>. Origin file is
+ * src/intl/charset.c from the UTF-8 branch commit elinks-0.11.0-g31f2c28.
+ */
+
+static inline int
+unicode_width(unsigned long c, int tab_size)
+{
+       if (c >= 0x1100 &&
+          (c <= 0x115f                         /* Hangul Jamo */
+           || c == 0x2329
+           || c == 0x232a
+           || (c >= 0x2e80  && c <= 0xa4cf && c != 0x303f)
+                                               /* CJK ... Yi */
+           || (c >= 0xac00  && c <= 0xd7a3)    /* Hangul Syllables */
+           || (c >= 0xf900  && c <= 0xfaff)    /* CJK Compatibility Ideographs */
+           || (c >= 0xfe30  && c <= 0xfe6f)    /* CJK Compatibility Forms */
+           || (c >= 0xff00  && c <= 0xff60)    /* Fullwidth Forms */
+           || (c >= 0xffe0  && c <= 0xffe6)
+           || (c >= 0x20000 && c <= 0x2fffd)
+           || (c >= 0x30000 && c <= 0x3fffd)))
+               return 2;
+
+       if (c == '\t')
+               return tab_size;
+
+       return 1;
+}
+
+/* Number of bytes used for encoding a UTF-8 character indexed by first byte.
+ * Illegal bytes are set one. */
+static const unsigned char utf8_bytes[256] = {
+       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
+       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
+       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
+       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
+       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
+       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
+       2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,
+       3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4, 5,5,5,5,6,6,1,1,
+};
+
+static inline unsigned char
+utf8_char_length(const char *string, const char *end)
+{
+       int c = *(unsigned char *) string;
+
+       return utf8_bytes[c];
+}
+
+/* Decode UTF-8 multi-byte representation into a Unicode character. */
+static inline unsigned long
+utf8_to_unicode(const char *string, size_t length)
+{
+       unsigned long unicode;
+
+       switch (length) {
+       case 1:
+               unicode  =   string[0];
+               break;
+       case 2:
+               unicode  =  (string[0] & 0x1f) << 6;
+               unicode +=  (string[1] & 0x3f);
+               break;
+       case 3:
+               unicode  =  (string[0] & 0x0f) << 12;
+               unicode += ((string[1] & 0x3f) << 6);
+               unicode +=  (string[2] & 0x3f);
+               break;
+       case 4:
+               unicode  =  (string[0] & 0x0f) << 18;
+               unicode += ((string[1] & 0x3f) << 12);
+               unicode += ((string[2] & 0x3f) << 6);
+               unicode +=  (string[3] & 0x3f);
+               break;
+       case 5:
+               unicode  =  (string[0] & 0x0f) << 24;
+               unicode += ((string[1] & 0x3f) << 18);
+               unicode += ((string[2] & 0x3f) << 12);
+               unicode += ((string[3] & 0x3f) << 6);
+               unicode +=  (string[4] & 0x3f);
+               break;
+       case 6:
+               unicode  =  (string[0] & 0x01) << 30;
+               unicode += ((string[1] & 0x3f) << 24);
+               unicode += ((string[2] & 0x3f) << 18);
+               unicode += ((string[3] & 0x3f) << 12);
+               unicode += ((string[4] & 0x3f) << 6);
+               unicode +=  (string[5] & 0x3f);
+               break;
+       default:
+               return 0;
+       }
+
+       /* Invalid characters could return the special 0xfffd value but NUL
+        * should be just as good. */
+       return unicode > 0xffff ? 0 : unicode;
+}
+
+/* Calculates how much of string can be shown within the given maximum width
+ * and sets trimmed parameter to non-zero value if all of string could not be
+ * shown. If the reserve flag is TRUE, it will reserve at least one
+ * trailing character, which can be useful when drawing a delimiter.
+ *
+ * Returns the number of bytes to output from string to satisfy max_width. */
+static size_t
+utf8_length(const char **start, size_t skip, int *width, size_t max_width, int *trimmed, bool reserve, int tab_size)
+{
+       const char *string = *start;
+       const char *end = strchr(string, '\0');
+       unsigned char last_bytes = 0;
+       size_t last_ucwidth = 0;
+
+       *width = 0;
+       *trimmed = 0;
+
+       while (string < end) {
+               unsigned char bytes = utf8_char_length(string, end);
+               size_t ucwidth;
+               unsigned long unicode;
+
+               if (string + bytes > end)
+                       break;
+
+               /* Change representation to figure out whether
+                * it is a single- or double-width character. */
+
+               unicode = utf8_to_unicode(string, bytes);
+               /* FIXME: Graceful handling of invalid Unicode character. */
+               if (!unicode)
+                       break;
+
+               ucwidth = unicode_width(unicode, tab_size);
+               if (skip > 0) {
+                       skip -= ucwidth <= skip ? ucwidth : skip;
+                       *start += bytes;
+               }
+               *width  += ucwidth;
+               if (*width > max_width) {
+                       *trimmed = 1;
+                       *width -= ucwidth;
+                       if (reserve && *width == max_width) {
+                               string -= last_bytes;
+                               *width -= last_ucwidth;
+                       }
+                       break;
+               }
+
+               string  += bytes;
+               last_bytes = ucwidth ? bytes : 0;
+               last_ucwidth = ucwidth;
+       }
+
+       return string - *start;
+}
+
+
 #define DATE_INFO \
        DATE_(NO), \
        DATE_(DEFAULT), \
@@ -503,7 +660,7 @@ argv_from_string(const char *argv[SIZEOF_ARG], int *argc, char *cmd)
        return *argc < SIZEOF_ARG;
 }
 
-static void
+static bool
 argv_from_env(const char **argv, const char *name)
 {
        char *env = argv ? getenv(name) : NULL;
@@ -511,8 +668,7 @@ argv_from_env(const char **argv, const char *name)
 
        if (env && *env)
                env = strdup(env);
-       if (env && !argv_from_string(argv, &argc, env))
-               die("Too many arguments in the `%s` environment variable", name);
+       return !env || argv_from_string(argv, &argc, env);
 }
 
 
@@ -563,10 +719,10 @@ io_init(struct io *io, const char *dir, enum io_type type)
 }
 
 static bool
-io_init_rd(struct io *io, const char *argv[], const char *dir,
-               enum format_flags flags)
+io_format(struct io *io, const char *dir, enum io_type type,
+         const char *argv[], enum format_flags flags)
 {
-       io_init(io, dir, IO_RD);
+       io_init(io, dir, type);
        return format_argv(io->argv, argv, flags);
 }
 
@@ -704,8 +860,7 @@ io_run_bg(const char **argv)
 {
        struct io io = {};
 
-       io_init(&io, NULL, IO_BG);
-       if (!format_argv(io.argv, argv, FORMAT_NONE))
+       if (!io_format(&io, NULL, IO_BG, argv, FORMAT_NONE))
                return FALSE;
        return io_complete(&io);
 }
@@ -715,8 +870,7 @@ io_run_fg(const char **argv, const char *dir)
 {
        struct io io = {};
 
-       io_init(&io, dir, IO_FG);
-       if (!format_argv(io.argv, argv, FORMAT_NONE))
+       if (!io_format(&io, dir, IO_FG, argv, FORMAT_NONE))
                return FALSE;
        return io_complete(&io);
 }
@@ -726,18 +880,19 @@ io_run_append(const char **argv, enum format_flags flags, int fd)
 {
        struct io io = {};
 
-       io_init(&io, NULL, IO_AP);
+       if (!io_format(&io, NULL, IO_AP, argv, flags)) {
+               close(fd);
+               return FALSE;
+       }
+
        io.pipe = fd;
-       if (format_argv(io.argv, argv, flags))
-               return io_complete(&io);
-       close(fd);
-       return FALSE;
+       return io_complete(&io);
 }
 
 static bool
 io_run_rd(struct io *io, const char **argv, const char *dir, enum format_flags flags)
 {
-       return io_init_rd(io, argv, dir, flags) && io_start(io);
+       return io_format(io, dir, IO_RD, argv, flags) && io_start(io);
 }
 
 static bool
@@ -922,7 +1077,7 @@ io_run_load(const char **argv, const char *separators,
 {
        struct io io = {};
 
-       return io_init_rd(&io, argv, NULL, FORMAT_NONE)
+       return io_format(&io, NULL, IO_RD, argv, FORMAT_NONE)
                ? io_load(&io, separators, read_property) : ERR;
 }
 
@@ -1574,6 +1729,7 @@ static void
 add_builtin_run_requests(void)
 {
        const char *cherry_pick[] = { "git", "cherry-pick", "%(commit)", NULL };
+       const char *checkout[] = { "git", "checkout", "%(branch)", NULL };
        const char *commit[] = { "git", "commit", NULL };
        const char *gc[] = { "git", "gc", NULL };
        struct {
@@ -1584,6 +1740,7 @@ add_builtin_run_requests(void)
        } reqs[] = {
                { KEYMAP_MAIN,    'C', ARRAY_SIZE(cherry_pick) - 1, cherry_pick },
                { KEYMAP_STATUS,  'C', ARRAY_SIZE(commit) - 1, commit },
+               { KEYMAP_BRANCH,  'C', ARRAY_SIZE(checkout) - 1, checkout },
                { KEYMAP_GENERIC, 'G', ARRAY_SIZE(gc) - 1, gc },
        };
        int i;
@@ -2001,6 +2158,7 @@ static unsigned int current_view;
 static char ref_blob[SIZEOF_REF]       = "";
 static char ref_commit[SIZEOF_REF]     = "HEAD";
 static char ref_head[SIZEOF_REF]       = "HEAD";
+static char ref_branch[SIZEOF_REF]     = "";
 
 struct view {
        const char *name;       /* View name */
@@ -2956,6 +3114,7 @@ format_arg(const char *name)
                FORMAT_VAR("%(head)",           ref_head,       ""),
                FORMAT_VAR("%(commit)",         ref_commit,     ""),
                FORMAT_VAR("%(blob)",           ref_blob,       ""),
+               FORMAT_VAR("%(branch)",         ref_branch,     ""),
        };
        int i;
 
@@ -2963,8 +3122,10 @@ format_arg(const char *name)
                if (!strncmp(name, vars[i].name, vars[i].namelen))
                        return *vars[i].value ? vars[i].value : vars[i].value_if_empty;
 
+       report("Unknown replacement: `%s`", name);
        return NULL;
 }
+
 static bool
 format_argv(const char *dst_argv[], const char *src_argv[], enum format_flags flags)
 {
@@ -2984,8 +3145,6 @@ format_argv(const char *dst_argv[], const char *src_argv[], enum format_flags fl
                        const char *value;
 
                        if (!next || noreplace) {
-                               if (flags == FORMAT_DASH && !strcmp(arg, "--"))
-                                       noreplace = TRUE;
                                len = strlen(arg);
                                value = "";
 
@@ -2993,7 +3152,6 @@ format_argv(const char *dst_argv[], const char *src_argv[], enum format_flags fl
                                value = format_arg(next);
 
                                if (!value) {
-                                       report("Unknown replacement: `%s`", next);
                                        return FALSE;
                                }
                        }
@@ -3061,12 +3219,11 @@ setup_update(struct view *view, const char *vid)
 }
 
 static bool
-prepare_update(struct view *view, const char *argv[], const char *dir,
-              enum format_flags flags)
+prepare_update(struct view *view, const char *argv[], const char *dir)
 {
        if (view->pipe)
                end_update(view, TRUE);
-       return io_init_rd(&view->io, argv, dir, flags);
+       return io_format(&view->io, dir, IO_RD, argv, FORMAT_NONE);
 }
 
 static bool
@@ -3087,7 +3244,7 @@ begin_update(struct view *view, bool refresh)
                if (view->ops->prepare) {
                        if (!view->ops->prepare(view))
                                return FALSE;
-               } else if (!io_init_rd(&view->io, view->ops->argv, NULL, FORMAT_ALL)) {
+               } else if (!io_format(&view->io, NULL, IO_RD, view->ops->argv, FORMAT_ALL)) {
                        return FALSE;
                }
 
@@ -4615,7 +4772,7 @@ tree_prepare(struct view *view)
                opt_path[0] = 0;
        }
 
-       return io_init_rd(&view->io, view->ops->argv, opt_cdup, FORMAT_ALL);
+       return io_format(&view->io, opt_cdup, IO_RD, view->ops->argv, FORMAT_ALL);
 }
 
 static const char *tree_argv[SIZEOF_ARG] = {
@@ -5030,7 +5187,7 @@ blame_request(struct view *view, enum request request, struct line *line)
                                diff_index_argv[7] = "/dev/null";
                        }
 
-                       if (!prepare_update(diff, diff_index_argv, NULL, FORMAT_DASH)) {
+                       if (!prepare_update(diff, diff_index_argv, NULL)) {
                                report("Failed to allocate diff command");
                                break;
                        }
@@ -5168,7 +5325,7 @@ branch_request(struct view *view, enum request request, struct line *line)
                        };
                        struct view *main_view = VIEW(REQ_VIEW_MAIN);
 
-                       if (!prepare_update(main_view, all_branches_argv, NULL, FORMAT_NONE)) {
+                       if (!prepare_update(main_view, all_branches_argv, NULL)) {
                                report("Failed to load view of all branches");
                                return REQ_NONE;
                        }
@@ -5283,6 +5440,7 @@ branch_select(struct view *view, struct line *line)
        string_copy_rev(view->ref, branch->ref->id);
        string_copy_rev(ref_commit, branch->ref->id);
        string_copy_rev(ref_head, branch->ref->id);
+       string_copy_rev(ref_branch, branch->ref->name);
 }
 
 static struct view_ops branch_ops = {
@@ -5652,7 +5810,7 @@ status_enter(struct view *view, struct line *line)
                                        "--", "/dev/null", newpath, NULL
                        };
 
-                       if (!prepare_update(stage, no_head_diff_argv, opt_cdup, FORMAT_DASH))
+                       if (!prepare_update(stage, no_head_diff_argv, opt_cdup))
                                return status_load_error(view, stage, newpath);
                } else {
                        const char *index_show_argv[] = {
@@ -5661,7 +5819,7 @@ status_enter(struct view *view, struct line *line)
                                        oldpath, newpath, NULL
                        };
 
-                       if (!prepare_update(stage, index_show_argv, opt_cdup, FORMAT_DASH))
+                       if (!prepare_update(stage, index_show_argv, opt_cdup))
                                return status_load_error(view, stage, newpath);
                }
 
@@ -5678,7 +5836,7 @@ status_enter(struct view *view, struct line *line)
                                "-C", "-M", "--", oldpath, newpath, NULL
                };
 
-               if (!prepare_update(stage, files_show_argv, opt_cdup, FORMAT_DASH))
+               if (!prepare_update(stage, files_show_argv, opt_cdup))
                        return status_load_error(view, stage, newpath);
                if (status)
                        info = "Unstaged changes to %s";
@@ -6748,166 +6906,6 @@ static struct view_ops main_ops = {
 };
 
 
-/*
- * Unicode / UTF-8 handling
- *
- * NOTE: Much of the following code for dealing with Unicode is derived from
- * ELinks' UTF-8 code developed by Scrool <scroolik@gmail.com>. Origin file is
- * src/intl/charset.c from the UTF-8 branch commit elinks-0.11.0-g31f2c28.
- */
-
-static inline int
-unicode_width(unsigned long c, int tab_size)
-{
-       if (c >= 0x1100 &&
-          (c <= 0x115f                         /* Hangul Jamo */
-           || c == 0x2329
-           || c == 0x232a
-           || (c >= 0x2e80  && c <= 0xa4cf && c != 0x303f)
-                                               /* CJK ... Yi */
-           || (c >= 0xac00  && c <= 0xd7a3)    /* Hangul Syllables */
-           || (c >= 0xf900  && c <= 0xfaff)    /* CJK Compatibility Ideographs */
-           || (c >= 0xfe30  && c <= 0xfe6f)    /* CJK Compatibility Forms */
-           || (c >= 0xff00  && c <= 0xff60)    /* Fullwidth Forms */
-           || (c >= 0xffe0  && c <= 0xffe6)
-           || (c >= 0x20000 && c <= 0x2fffd)
-           || (c >= 0x30000 && c <= 0x3fffd)))
-               return 2;
-
-       if (c == '\t')
-               return tab_size;
-
-       return 1;
-}
-
-/* Number of bytes used for encoding a UTF-8 character indexed by first byte.
- * Illegal bytes are set one. */
-static const unsigned char utf8_bytes[256] = {
-       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
-       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
-       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
-       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
-       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
-       1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
-       2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,
-       3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4, 5,5,5,5,6,6,1,1,
-};
-
-static inline unsigned char
-utf8_char_length(const char *string, const char *end)
-{
-       int c = *(unsigned char *) string;
-
-       return utf8_bytes[c];
-}
-
-/* Decode UTF-8 multi-byte representation into a Unicode character. */
-static inline unsigned long
-utf8_to_unicode(const char *string, size_t length)
-{
-       unsigned long unicode;
-
-       switch (length) {
-       case 1:
-               unicode  =   string[0];
-               break;
-       case 2:
-               unicode  =  (string[0] & 0x1f) << 6;
-               unicode +=  (string[1] & 0x3f);
-               break;
-       case 3:
-               unicode  =  (string[0] & 0x0f) << 12;
-               unicode += ((string[1] & 0x3f) << 6);
-               unicode +=  (string[2] & 0x3f);
-               break;
-       case 4:
-               unicode  =  (string[0] & 0x0f) << 18;
-               unicode += ((string[1] & 0x3f) << 12);
-               unicode += ((string[2] & 0x3f) << 6);
-               unicode +=  (string[3] & 0x3f);
-               break;
-       case 5:
-               unicode  =  (string[0] & 0x0f) << 24;
-               unicode += ((string[1] & 0x3f) << 18);
-               unicode += ((string[2] & 0x3f) << 12);
-               unicode += ((string[3] & 0x3f) << 6);
-               unicode +=  (string[4] & 0x3f);
-               break;
-       case 6:
-               unicode  =  (string[0] & 0x01) << 30;
-               unicode += ((string[1] & 0x3f) << 24);
-               unicode += ((string[2] & 0x3f) << 18);
-               unicode += ((string[3] & 0x3f) << 12);
-               unicode += ((string[4] & 0x3f) << 6);
-               unicode +=  (string[5] & 0x3f);
-               break;
-       default:
-               die("Invalid Unicode length");
-       }
-
-       /* Invalid characters could return the special 0xfffd value but NUL
-        * should be just as good. */
-       return unicode > 0xffff ? 0 : unicode;
-}
-
-/* Calculates how much of string can be shown within the given maximum width
- * and sets trimmed parameter to non-zero value if all of string could not be
- * shown. If the reserve flag is TRUE, it will reserve at least one
- * trailing character, which can be useful when drawing a delimiter.
- *
- * Returns the number of bytes to output from string to satisfy max_width. */
-static size_t
-utf8_length(const char **start, size_t skip, int *width, size_t max_width, int *trimmed, bool reserve, int tab_size)
-{
-       const char *string = *start;
-       const char *end = strchr(string, '\0');
-       unsigned char last_bytes = 0;
-       size_t last_ucwidth = 0;
-
-       *width = 0;
-       *trimmed = 0;
-
-       while (string < end) {
-               unsigned char bytes = utf8_char_length(string, end);
-               size_t ucwidth;
-               unsigned long unicode;
-
-               if (string + bytes > end)
-                       break;
-
-               /* Change representation to figure out whether
-                * it is a single- or double-width character. */
-
-               unicode = utf8_to_unicode(string, bytes);
-               /* FIXME: Graceful handling of invalid Unicode character. */
-               if (!unicode)
-                       break;
-
-               ucwidth = unicode_width(unicode, tab_size);
-               if (skip > 0) {
-                       skip -= ucwidth <= skip ? ucwidth : skip;
-                       *start += bytes;
-               }
-               *width  += ucwidth;
-               if (*width > max_width) {
-                       *trimmed = 1;
-                       *width -= ucwidth;
-                       if (reserve && *width == max_width) {
-                               string -= last_bytes;
-                               *width -= last_ucwidth;
-                       }
-                       break;
-               }
-
-               string  += bytes;
-               last_bytes = ucwidth ? bytes : 0;
-               last_ucwidth = ucwidth;
-       }
-
-       return string - *start;
-}
-
-
 /*
  * Status management
  */
@@ -7430,7 +7428,8 @@ load_refs(void)
        size_t i;
 
        if (!init) {
-               argv_from_env(ls_remote_argv, "TIG_LS_REMOTE");
+               if (!argv_from_env(ls_remote_argv, "TIG_LS_REMOTE"))
+                       die("TIG_LS_REMOTE contains too many arguments");
                init = TRUE;
        }
 
@@ -7735,7 +7734,7 @@ parse_options(int argc, const char *argv[])
                        die("command too long");
        }
 
-       if (!prepare_update(VIEW(request), custom_argv, NULL, FORMAT_NONE))
+       if (!prepare_update(VIEW(request), custom_argv, NULL))
                die("Failed to format arguments");
 
        return request;
@@ -7785,7 +7784,9 @@ main(int argc, const char *argv[])
                die("Failed to load refs.");
 
        foreach_view (view, i)
-               argv_from_env(view->ops->argv, view->cmd_env);
+               if (!argv_from_env(view->ops->argv, view->cmd_env))
+                       die("Too many arguments in the `%s` environment variable",
+                           view->cmd_env);
 
        init_display();
 
@@ -7828,7 +7829,7 @@ main(int argc, const char *argv[])
 
                                if (!argv_from_string(argv, &argc, cmd)) {
                                        report("Too many arguments");
-                               } else if (!prepare_update(next, argv, NULL, FORMAT_DASH)) {
+                               } else if (!prepare_update(next, argv, NULL)) {
                                        report("Failed to format command");
                                } else {
                                        open_view(view, REQ_VIEW_PAGER, OPEN_PREPARED);