Skip to content

Commit

Permalink
Merge branch 'ph/rebase-i-redo' into maint
Browse files Browse the repository at this point in the history
"git rebase -i" moved the "current" command from "todo" to "done" a
bit too prematurely, losing a step when a "pick" did not even start.

* ph/rebase-i-redo:
  rebase -i: redo tasks that die during cherry-pick
  • Loading branch information
Junio C Hamano committed Jun 5, 2015
2 parents 8d5ef5a + 8cbc57c commit c7b4de2
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
16 changes: 16 additions & 0 deletions git-rebase--interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,16 @@ mark_action_done () {
fi
}

# Put the last action marked done at the beginning of the todo list
# again. If there has not been an action marked done yet, leave the list of
# items on the todo list unchanged.
reschedule_last_action () {
tail -n 1 "$done" | cat - "$todo" >"$todo".new
sed -e \$d <"$done" >"$done".new
mv -f "$todo".new "$todo"
mv -f "$done".new "$done"
}

append_todo_help () {
git stripspace --comment-lines >>"$todo" <<\EOF
Expand Down Expand Up @@ -252,6 +262,12 @@ pick_one () {
output eval git cherry-pick \
${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
"$strategy_args" $empty_args $ff "$@"

# If cherry-pick dies it leaves the to-be-picked commit unrecorded. Reschedule
# previous task so this commit is not lost.
ret=$?
case "$ret" in [01]) ;; *) reschedule_last_action ;; esac
return $ret
}

pick_one_preserving_merges () {
Expand Down
47 changes: 47 additions & 0 deletions t/t3404-rebase-interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1055,4 +1055,51 @@ test_expect_success 'todo count' '
grep "^# Rebase ..* onto ..* ([0-9]" actual
'

test_expect_success 'rebase -i commits that overwrite untracked files (pick)' '
git checkout --force branch2 &&
git clean -f &&
set_fake_editor &&
FAKE_LINES="edit 1 2" git rebase -i A &&
test_cmp_rev HEAD F &&
test_path_is_missing file6 &&
>file6 &&
test_must_fail git rebase --continue &&
test_cmp_rev HEAD F &&
rm file6 &&
git rebase --continue &&
test_cmp_rev HEAD I
'

test_expect_success 'rebase -i commits that overwrite untracked files (squash)' '
git checkout --force branch2 &&
git clean -f &&
git tag original-branch2 &&
set_fake_editor &&
FAKE_LINES="edit 1 squash 2" git rebase -i A &&
test_cmp_rev HEAD F &&
test_path_is_missing file6 &&
>file6 &&
test_must_fail git rebase --continue &&
test_cmp_rev HEAD F &&
rm file6 &&
git rebase --continue &&
test $(git cat-file commit HEAD | sed -ne \$p) = I &&
git reset --hard original-branch2
'

test_expect_success 'rebase -i commits that overwrite untracked files (no ff)' '
git checkout --force branch2 &&
git clean -f &&
set_fake_editor &&
FAKE_LINES="edit 1 2" git rebase -i --no-ff A &&
test $(git cat-file commit HEAD | sed -ne \$p) = F &&
test_path_is_missing file6 &&
>file6 &&
test_must_fail git rebase --continue &&
test $(git cat-file commit HEAD | sed -ne \$p) = F &&
rm file6 &&
git rebase --continue &&
test $(git cat-file commit HEAD | sed -ne \$p) = I
'

test_done

0 comments on commit c7b4de2

Please sign in to comment.