rebase: introduce a shortcut for --reschedule-failed-exec

It is a bit cumbersome to write out the `--reschedule-failed-exec`
option before `-x <cmd>` all the time; let's introduce a convenient
option to do both at the same time: `-y <cmd>`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2018-12-10 11:05:01 -08:00 committed by Junio C Hamano
parent 969de3ff0e
commit 81ef8ee75d
4 changed files with 36 additions and 0 deletions

View File

@ -462,6 +462,12 @@ without an explicit `--interactive`.
+ +
See also INCOMPATIBLE OPTIONS below. See also INCOMPATIBLE OPTIONS below.
-y <cmd>::
This is the same as passing `--reschedule-failed-exec` before
`-x <cmd>`, i.e. it appends the specified `exec` command and
turns on the mode where failed `exec` commands are automatically
rescheduled.
--root:: --root::
Rebase all commits reachable from <branch>, instead of Rebase all commits reachable from <branch>, instead of
limiting them with an <upstream>. This allows you to rebase limiting them with an <upstream>. This allows you to rebase

View File

@ -754,6 +754,23 @@ static int parse_opt_interactive(const struct option *opt, const char *arg,
return 0; 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) static void NORETURN error_on_missing_default_upstream(void)
{ {
struct branch *current_branch = branch_get(NULL); struct branch *current_branch = branch_get(NULL);
@ -834,6 +851,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
struct string_list strategy_options = STRING_LIST_INIT_NODUP; struct string_list strategy_options = STRING_LIST_INIT_NODUP;
struct object_id squash_onto; struct object_id squash_onto;
char *squash_onto_name = NULL; char *squash_onto_name = NULL;
struct opt_y opt_y = { .list = &exec, .options = &options };
struct option builtin_rebase_options[] = { struct option builtin_rebase_options[] = {
OPT_STRING(0, "onto", &options.onto_name, OPT_STRING(0, "onto", &options.onto_name,
N_("revision"), N_("revision"),
@ -911,6 +929,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
OPT_STRING_LIST('x', "exec", &exec, N_("exec"), OPT_STRING_LIST('x', "exec", &exec, N_("exec"),
N_("add exec lines after each commit of the " N_("add exec lines after each commit of the "
"editable list")), "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", OPT_BOOL(0, "allow-empty-message",
&options.allow_empty_message, &options.allow_empty_message,
N_("allow rebasing commits with empty messages")), N_("allow rebasing commits with empty messages")),

View File

@ -26,6 +26,7 @@ f,force-rebase! cherry-pick all commits, even if unchanged
m,merge! use merging strategies to rebase m,merge! use merging strategies to rebase
i,interactive! let the user edit the list of commits to rebase i,interactive! let the user edit the list of commits to rebase
x,exec=! add exec lines after each commit of the editable list x,exec=! add exec lines after each commit of the editable list
y=! same as --reschedule-failed-exec -x
k,keep-empty preserve empty commits during rebase k,keep-empty preserve empty commits during rebase
allow-empty-message allow rebasing commits with empty messages allow-empty-message allow rebasing commits with empty messages
stat! display a diffstat of what changed upstream stat! display a diffstat of what changed upstream
@ -262,6 +263,11 @@ do
cmd="${cmd}exec ${1#--exec=}${LF}" cmd="${cmd}exec ${1#--exec=}${LF}"
test -z "$interactive_rebase" && interactive_rebase=implied test -z "$interactive_rebase" && interactive_rebase=implied
;; ;;
-y*)
reschedule_failed_exec=--reschedule-failed-exec
cmd="${cmd}exec ${1#-y}${LF}"
test -z "$interactive_rebase" && interactive_rebase=implied
;;
--interactive) --interactive)
interactive_rebase=explicit interactive_rebase=explicit
;; ;;

View File

@ -262,6 +262,9 @@ test_expect_success '--reschedule-failed-exec' '
test_must_fail git -c rebase.rescheduleFailedExec=true \ test_must_fail git -c rebase.rescheduleFailedExec=true \
rebase -x false HEAD^ 2>err && rebase -x false HEAD^ 2>err &&
grep "^exec false" .git/rebase-merge/git-rebase-todo && grep "^exec false" .git/rebase-merge/git-rebase-todo &&
test_i18ngrep "has been rescheduled" err &&
git rebase --abort &&
test_must_fail git rebase -y false HEAD^ 2>err &&
test_i18ngrep "has been rescheduled" err test_i18ngrep "has been rescheduled" err
' '