mirror of
https://github.com/git/git.git
synced 2024-12-04 15:34:05 +08:00
Merge branch 'ph/rebase-i-redo'
"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
This commit is contained in:
commit
eae0216646
@ -132,6 +132,16 @@ mark_action_done () {
|
|||||||
fi
|
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 () {
|
append_todo_help () {
|
||||||
git stripspace --comment-lines >>"$todo" <<\EOF
|
git stripspace --comment-lines >>"$todo" <<\EOF
|
||||||
|
|
||||||
@ -252,6 +262,12 @@ pick_one () {
|
|||||||
output eval git cherry-pick \
|
output eval git cherry-pick \
|
||||||
${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
|
${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
|
||||||
"$strategy_args" $empty_args $ff "$@"
|
"$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 () {
|
pick_one_preserving_merges () {
|
||||||
|
@ -1055,4 +1055,51 @@ test_expect_success 'todo count' '
|
|||||||
grep "^# Rebase ..* onto ..* ([0-9]" actual
|
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
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user