Skip to content

Commit

Permalink
Merge branch 'cw/rebase-i-root'
Browse files Browse the repository at this point in the history
Finishing touches to the "rebase -i --root" (new feature for
1.7.12).

* cw/rebase-i-root:
  rebase -i: handle fixup of root commit correctly
  • Loading branch information
Junio C Hamano committed Jul 25, 2012
2 parents b00445b + 2147f84 commit 7b9f29c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 12 deletions.
25 changes: 13 additions & 12 deletions git-rebase--interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -493,25 +493,28 @@ do_next () {
author_script_content=$(get_author_ident_from_commit HEAD)
echo "$author_script_content" > "$author_script"
eval "$author_script_content"
output git reset --soft HEAD^
pick_one -n $sha1 || die_failed_squash $sha1 "$rest"
if ! pick_one -n $sha1
then
git rev-parse --verify HEAD >"$amend"
die_failed_squash $sha1 "$rest"
fi
case "$(peek_next_command)" in
squash|s|fixup|f)
# This is an intermediate commit; its message will only be
# used in case of trouble. So use the long version:
do_with_author output git commit --no-verify -F "$squash_msg" ||
do_with_author output git commit --amend --no-verify -F "$squash_msg" ||
die_failed_squash $sha1 "$rest"
;;
*)
# This is the final command of this squash/fixup group
if test -f "$fixup_msg"
then
do_with_author git commit --no-verify -F "$fixup_msg" ||
do_with_author git commit --amend --no-verify -F "$fixup_msg" ||
die_failed_squash $sha1 "$rest"
else
cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
rm -f "$GIT_DIR"/MERGE_MSG
do_with_author git commit --no-verify -e ||
do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e ||
die_failed_squash $sha1 "$rest"
fi
rm -f "$squash_msg" "$fixup_msg"
Expand Down Expand Up @@ -748,21 +751,19 @@ In both case, once you're done, continue with:
fi
. "$author_script" ||
die "Error trying to find the author identity to amend commit"
current_head=
if test -f "$amend"
then
current_head=$(git rev-parse --verify HEAD)
test "$current_head" = $(cat "$amend") ||
die "\
You have uncommitted changes in your working tree. Please, commit them
first and then run 'git rebase --continue' again."
git reset --soft HEAD^ ||
die "Cannot rewind the HEAD"
do_with_author git commit --amend --no-verify -F "$msg" -e ||
die "Could not commit staged changes."
else
do_with_author git commit --no-verify -F "$msg" -e ||
die "Could not commit staged changes."
fi
do_with_author git commit --no-verify -F "$msg" -e || {
test -n "$current_head" && git reset --soft $current_head
die "Could not commit staged changes."
}
fi

record_in_rewritten "$(cat "$state_dir"/stopped-sha)"
Expand Down
8 changes: 8 additions & 0 deletions t/t3404-rebase-interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -903,4 +903,12 @@ test_expect_success 'rebase -i --root temporary sentinel commit' '
git rebase --abort
'

test_expect_success 'rebase -i --root fixup root commit' '
git checkout B &&
FAKE_LINES="1 fixup 2" git rebase -i --root &&
test A = $(git cat-file commit HEAD | sed -ne \$p) &&
test B = $(git show HEAD:file1) &&
test 0 = $(git cat-file commit HEAD | grep -c ^parent\ )
'

test_done

0 comments on commit 7b9f29c

Please sign in to comment.