sha1_file: remove recursion in unpack_entry
[gitweb.git] / git-rebase--am.sh
index 392ebc9790c88f9857fc4e943d1fe6351e953c7d..97f31dc7af43bafe36d3222ba2f78da861a4e620 100644 (file)
@@ -18,6 +18,7 @@ esac
 
 test -n "$rebase_root" && root_flag=--root
 
+ret=0
 if test -n "$keep_empty"
 then
        # we have to do this the hard way.  git format-patch completely squashes
@@ -25,13 +26,49 @@ then
        # 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 $root_flag "$revisions" |
-       git am $git_am_opt --rebasing --resolvemsg="$resolvemsg"
-fi && move_to_original_branch
+               --no-renames $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
 
-ret=$?
-test 0 != $ret -a -d "$state_dir" && write_basic_state
-exit $ret
+move_to_original_branch