Merge branch 'ae/preservemerge'
authorJunio C Hamano <gitster@pobox.com>
Sun, 19 Oct 2008 23:06:31 +0000 (16:06 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 19 Oct 2008 23:06:31 +0000 (16:06 -0700)
* ae/preservemerge:
rebase: Support preserving merges in non-interactive mode

Documentation/git-rebase.txt
git-rebase.sh
t/t3409-rebase-preserve-merges.sh [new file with mode: 0755]
index 4e8438098fc9862ae83280f8f191329d1251bc55..d639985693705930cba6f078b0bd1f8b61b65da4 100644 (file)
@@ -253,8 +253,7 @@ OPTIONS
 
 -p::
 --preserve-merges::
-       Instead of ignoring merges, try to recreate them.  This option
-       only works in interactive mode.
+       Instead of ignoring merges, try to recreate them.
 
 include::merge-strategies.txt[]
 
index f2742aa054d2080a4a554ade3916c3bfa110af67..023a6dc94a48f7abf2801359ad68d40909e9b6aa 100755 (executable)
@@ -139,10 +139,26 @@ finish_rb_merge () {
 }
 
 is_interactive () {
-       test -f "$dotest"/interactive ||
-       while :; do case $#,"$1" in 0,|*,-i|*,--interactive) break ;; esac
+       while test $# != 0
+       do
+               case "$1" in
+                       -i|--interactive)
+                               interactive_rebase=explicit
+                               break
+                       ;;
+                       -p|--preserve-merges)
+                               interactive_rebase=implied
+                       ;;
+               esac
                shift
-       done && test -n "$1"
+       done
+
+       if [ "$interactive_rebase" = implied ]; then
+               GIT_EDITOR=:
+               export GIT_EDITOR
+       fi
+
+       test -n "$interactive_rebase" || test -f "$dotest"/interactive
 }
 
 run_pre_rebase_hook () {
diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh
new file mode 100755 (executable)
index 0000000..8cde40f
--- /dev/null
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright(C) 2008 Stephen Habermann & Andreas Ericsson
+#
+test_description='git rebase -p should preserve merges
+
+Run "git rebase -p" and check that merges are properly carried along
+'
+. ./test-lib.sh
+
+GIT_AUTHOR_EMAIL=bogus_email_address
+export GIT_AUTHOR_EMAIL
+
+#echo 'Setting up:
+#
+#A1--A2  <-- origin/master
+# \   \
+#  B1--M  <-- topic
+#   \
+#    B2  <-- origin/topic
+#
+#'
+
+test_expect_success 'setup for merge-preserving rebase' \
+       'echo First > A &&
+       git add A &&
+       git-commit -m "Add A1" &&
+       git checkout -b topic &&
+       echo Second > B &&
+       git add B &&
+       git-commit -m "Add B1" &&
+       git checkout -f master &&
+       echo Third >> A &&
+       git-commit -a -m "Modify A2" &&
+
+       git clone ./. clone1 &&
+       cd clone1 &&
+       git checkout -b topic origin/topic &&
+       git merge origin/master &&
+       cd ..
+
+       git clone ./. clone2
+       cd clone2 &&
+       git checkout -b topic origin/topic &&
+       git merge origin/master &&
+       cd .. &&
+
+       git checkout topic &&
+       echo Fourth >> B &&
+       git commit -a -m "Modify B2"
+'
+
+test_expect_success 'rebase -p fakes interactive rebase' '
+       cd clone2 &&
+       git fetch &&
+       git rebase -p origin/topic &&
+       test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
+       test 1 = $(git rev-list --all --pretty=oneline | grep "Merge commit" | wc -l)
+'
+
+test_done