diff options
-rwxr-xr-x | git-rebase.sh | 35 | ||||
-rwxr-xr-x | t/t3422-rebase-incompatible-options.sh | 16 |
2 files changed, 43 insertions, 8 deletions
diff --git a/git-rebase.sh b/git-rebase.sh index bf71b7fa20..18ac8226c4 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -503,6 +503,24 @@ then git_format_patch_opt="$git_format_patch_opt --progress" fi +if test -n "$git_am_opt"; then + incompatible_opts=$(echo " $git_am_opt " | \ + sed -e 's/ -q / /g' -e 's/^ \(.*\) $/\1/') + if test -n "$interactive_rebase" + then + if test -n "$incompatible_opts" + then + die "$(gettext "error: cannot combine interactive options (--interactive, --exec, --rebase-merges, --preserve-merges, --keep-empty, --root + --onto) with am options ($incompatible_opts)")" + fi + fi + if test -n "$do_merge"; then + if test -n "$incompatible_opts" + then + die "$(gettext "error: cannot combine merge options (--merge, --strategy, --strategy-option) with am options ($incompatible_opts)")" + fi + fi +fi + if test -n "$signoff" then test -n "$preserve_merges" && @@ -511,6 +529,23 @@ then force_rebase=t fi +if test -n "$preserve_merges" +then + # Note: incompatibility with --signoff handled in signoff block above + # Note: incompatibility with --interactive is just a strong warning; + # git-rebase.txt caveats with "unless you know what you are doing" + test -n "$rebase_merges" && + die "$(gettext "error: cannot combine '--preserve_merges' with '--rebase-merges'")" +fi + +if test -n "$rebase_merges" +then + test -n "$strategy_opts" && + die "$(gettext "error: cannot combine '--rebase_merges' with '--strategy-option'")" + test -n "$strategy" && + die "$(gettext "error: cannot combine '--rebase_merges' with '--strategy'")" +fi + if test -z "$rebase_root" then case "$#" in diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh index b007a15eba..bb78a6ec86 100755 --- a/t/t3422-rebase-incompatible-options.sh +++ b/t/t3422-rebase-incompatible-options.sh @@ -33,27 +33,27 @@ test_expect_success 'setup' ' test_rebase_am_only () { opt=$1 shift - test_expect_failure "$opt incompatible with --merge" " + test_expect_success "$opt incompatible with --merge" " git checkout B^0 && test_must_fail git rebase $opt --merge A " - test_expect_failure "$opt incompatible with --strategy=ours" " + test_expect_success "$opt incompatible with --strategy=ours" " git checkout B^0 && test_must_fail git rebase $opt --strategy=ours A " - test_expect_failure "$opt incompatible with --strategy-option=ours" " + test_expect_success "$opt incompatible with --strategy-option=ours" " git checkout B^0 && test_must_fail git rebase $opt --strategy-option=ours A " - test_expect_failure "$opt incompatible with --interactive" " + test_expect_success "$opt incompatible with --interactive" " git checkout B^0 && test_must_fail git rebase $opt --interactive A " - test_expect_failure "$opt incompatible with --exec" " + test_expect_success "$opt incompatible with --exec" " git checkout B^0 && test_must_fail git rebase $opt --exec 'true' A " @@ -70,17 +70,17 @@ test_expect_success '--preserve-merges incompatible with --signoff' ' test_must_fail git rebase --preserve-merges --signoff A ' -test_expect_failure '--preserve-merges incompatible with --rebase-merges' ' +test_expect_success '--preserve-merges incompatible with --rebase-merges' ' git checkout B^0 && test_must_fail git rebase --preserve-merges --rebase-merges A ' -test_expect_failure '--rebase-merges incompatible with --strategy' ' +test_expect_success '--rebase-merges incompatible with --strategy' ' git checkout B^0 && test_must_fail git rebase --rebase-merges -s resolve A ' -test_expect_failure '--rebase-merges incompatible with --strategy-option' ' +test_expect_success '--rebase-merges incompatible with --strategy-option' ' git checkout B^0 && test_must_fail git rebase --rebase-merges -Xignore-space-change A ' |