pretty: --format output should honor logOutputEncoding
[gitweb.git] / git-rebase--am.sh
index c9604a67d14adb7c92732c004ba8c6fe5378fc66..f84854f09a14b92790bad543cbe78c2662def9f7 100644 (file)
@@ -3,16 +3,14 @@
 # Copyright (c) 2010 Junio C Hamano.
 #
 
-. git-sh-setup
-
 case "$action" in
 continue)
-       git am --resolved --3way --resolvemsg="$resolvemsg" &&
+       git am --resolved --resolvemsg="$resolvemsg" &&
        move_to_original_branch
        exit
        ;;
 skip)
-       git am --skip -3 --resolvemsg="$resolvemsg" &&
+       git am --skip --resolvemsg="$resolvemsg" &&
        move_to_original_branch
        exit
        ;;
@@ -20,11 +18,57 @@ esac
 
 test -n "$rebase_root" && root_flag=--root
 
-git format-patch -k --stdout --full-index --ignore-if-in-upstream \
-       --src-prefix=a/ --dst-prefix=b/ \
-       --no-renames $root_flag "$revisions" |
-git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" &&
+ret=0
+if test -n "$keep_empty"
+then
+       # we have to do this the hard way.  git format-patch completely squashes
+       # empty commits and even if it didn't the format doesn't really lend
+       # itself well to recording empty patches.  fortunately, cherry-pick
+       # makes this easy
+       git cherry-pick --allow-empty "$revisions"
+       ret=$?
+else
+       rm -f "$GIT_DIR/rebased-patches"
+
+       git format-patch -k --stdout --full-index --ignore-if-in-upstream \
+               --src-prefix=a/ --dst-prefix=b/ --no-renames --no-cover-letter \
+               $root_flag "$revisions" >"$GIT_DIR/rebased-patches"
+       ret=$?
+
+       if test 0 != $ret
+       then
+               rm -f "$GIT_DIR/rebased-patches"
+               case "$head_name" in
+               refs/heads/*)
+                       git checkout -q "$head_name"
+                       ;;
+               *)
+                       git checkout -q "$orig_head"
+                       ;;
+               esac
+
+               cat >&2 <<-EOF
+
+               git encountered an error while preparing the patches to replay
+               these revisions:
+
+                   $revisions
+
+               As a result, git cannot rebase them.
+               EOF
+               exit $?
+       fi
+
+       git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" <"$GIT_DIR/rebased-patches"
+       ret=$?
+
+       rm -f "$GIT_DIR/rebased-patches"
+fi
+
+if test 0 != $ret
+then
+       test -d "$state_dir" && write_basic_state
+       exit $ret
+fi
+
 move_to_original_branch
-ret=$?
-test 0 != $ret -a -d "$state_dir" && write_basic_state
-exit $ret