Git 2.21-rc2
[gitweb.git] / builtin / rebase.c
index 0b039319e134d0c33df842666eddc820dc6c410c..7c7bc13e912aa8ba5d2c4dfa781fb74cd20ac6d4 100644 (file)
@@ -941,23 +941,6 @@ static int parse_opt_interactive(const struct option *opt, const char *arg,
        return 0;
 }
 
-struct opt_y {
-       struct string_list *list;
-       struct rebase_options *options;
-};
-
-static int parse_opt_y(const struct option *opt, const char *arg, int unset)
-{
-       struct opt_y *o = opt->value;
-
-       if (unset || !arg)
-               return -1;
-
-       o->options->reschedule_failed_exec = 1;
-       string_list_append(o->list, arg);
-       return 0;
-}
-
 static void NORETURN error_on_missing_default_upstream(void)
 {
        struct branch *current_branch = branch_get(NULL);
@@ -1005,6 +988,19 @@ static void set_reflog_action(struct rebase_options *options)
        strbuf_release(&buf);
 }
 
+static int check_exec_cmd(const char *cmd)
+{
+       if (strchr(cmd, '\n'))
+               return error(_("exec commands cannot contain newlines"));
+
+       /* Does the command consist purely of whitespace? */
+       if (!cmd[strspn(cmd, " \t\r\f\v")])
+               return error(_("empty exec command"));
+
+       return 0;
+}
+
+
 int cmd_rebase(int argc, const char **argv, const char *prefix)
 {
        struct rebase_options options = {
@@ -1038,7 +1034,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
        struct string_list strategy_options = STRING_LIST_INIT_NODUP;
        struct object_id squash_onto;
        char *squash_onto_name = NULL;
-       struct opt_y opt_y = { .list = &exec, .options = &options };
        struct option builtin_rebase_options[] = {
                OPT_STRING(0, "onto", &options.onto_name,
                           N_("revision"),
@@ -1116,9 +1111,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
                OPT_STRING_LIST('x', "exec", &exec, N_("exec"),
                                N_("add exec lines after each commit of the "
                                   "editable list")),
-               { OPTION_CALLBACK, 'y', NULL, &opt_y, N_("<cmd>"),
-                       N_("same as --reschedule-failed-exec -x <cmd>"),
-                       PARSE_OPT_NONEG, parse_opt_y },
                OPT_BOOL(0, "allow-empty-message",
                         &options.allow_empty_message,
                         N_("allow rebasing commits with empty messages")),
@@ -1348,6 +1340,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
                }
        }
 
+       for (i = 0; i < exec.nr; i++)
+               if (check_exec_cmd(exec.items[i].string))
+                       exit(1);
+
        if (!(options.flags & REBASE_NO_QUIET))
                argv_array_push(&options.git_am_opts, "-q");
 
@@ -1438,7 +1434,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
        }
 
        if (options.reschedule_failed_exec && !is_interactive(&options))
-               die(_("--reschedule-failed-exec requires an interactive rebase"));
+               die(_("%s requires an interactive rebase"), "--reschedule-failed-exec");
 
        if (options.git_am_opts.argc) {
                /* all am options except -q are compatible only with --am */