diff options
| author | Junio C Hamano <gitster@pobox.com> | 2015-06-05 12:00:10 -0700 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2015-06-05 12:00:10 -0700 |
| commit | c7b4de2cc549477be8e4eb2c0077f045e80a6d17 (patch) | |
| tree | 648d1a2b49ae8c65f914ad1d41a0aa7ad5cc270d /git-rebase--interactive.sh | |
| parent | 8d5ef5a0d1da18a2eb55c976720a8e96642c1b0b (diff) | |
| parent | 8cbc57ca1109ba455c6098654b7d732a01fd89fd (diff) | |
| download | git-c7b4de2cc549477be8e4eb2c0077f045e80a6d17.tar.xz | |
Merge branch 'ph/rebase-i-redo' into maint
"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
Diffstat (limited to 'git-rebase--interactive.sh')
| -rw-r--r-- | git-rebase--interactive.sh | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index f7deeb096e..0008057252 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -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 @@ -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 () { |
