rebase: Handle cases where format-patch fails

'format-patch' could fail due to reasons such as out of memory. Such
failures are not detected or handled, which causes rebase to incorrectly
think that it completed successfully and continue with cleanup. i.e.
calling move_to_original_branch

Instead of using a pipe, we separate 'format-patch' and 'am' by using an
intermediate file. This gurantees that we can invoke 'am' with the
complete input, or not invoking 'am' at all if 'format-patch' failed.

Also remove the use of '&&' at the end of the if-block, and rearrange
the 'write_basic_state' and 'move_to_original_branch' to make the logic
flow a bit better and easier to read.

Signed-off-by: Andrew Wong <andrew.kw.w@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Andrew Wong 2012-10-10 23:54:03 -04:00 committed by Junio C Hamano
parent 40701adbcb
commit e481af06be
1 changed files with 43 additions and 6 deletions

View File

@ -18,6 +18,7 @@ esac


test -n "$rebase_root" && root_flag=--root test -n "$rebase_root" && root_flag=--root


ret=0
if test -n "$keep_empty" if test -n "$keep_empty"
then then
# we have to do this the hard way. git format-patch completely squashes # 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 # itself well to recording empty patches. fortunately, cherry-pick
# makes this easy # makes this easy
git cherry-pick --allow-empty "$revisions" git cherry-pick --allow-empty "$revisions"
ret=$?
else else
rm -f "$GIT_DIR/rebased-patches"

git format-patch -k --stdout --full-index --ignore-if-in-upstream \ git format-patch -k --stdout --full-index --ignore-if-in-upstream \
--src-prefix=a/ --dst-prefix=b/ \ --src-prefix=a/ --dst-prefix=b/ \
--no-renames $root_flag "$revisions" | --no-renames $root_flag "$revisions" >"$GIT_DIR/rebased-patches"
git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" ret=$?
fi && move_to_original_branch


ret=$? if test 0 != $ret
test 0 != $ret -a -d "$state_dir" && write_basic_state then
exit $ret 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