Skip to content

Commit

Permalink
rebase: Handle cases where format-patch fails
Browse files Browse the repository at this point in the history
'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>
  • Loading branch information
andrewkww authored and gitster committed Oct 11, 2012
1 parent 40701ad commit e481af0
Showing 1 changed file with 43 additions and 6 deletions.
49 changes: 43 additions & 6 deletions git-rebase--am.sh
Expand Up @@ -18,20 +18,57 @@ 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
# 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 $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

0 comments on commit e481af0

Please sign in to comment.