[PATCH 4/7] sequencer: handle cherry-pick conflict in last commit
From: Ramkumar Ramachandra <hidden>
Date: 2016-06-15 22:52:28
Subsystem:
the rest · Maintainer:
Linus Torvalds
The previous two commits in the series implement special handling for the single-commit cherry-pick case. Although we can technically revert the changes made by d3f4628e (revert: Remove sequencer state when no commits are pending, 2011-06-06) without breaking any existing tests now, there is one pending corner case: when a cherry-pick is invoked on a commit range, and a conflict that occurs in the last commit is concluded with a 'git commit'. Without d3f4628e, we'd have the following unpleasant case: $ git cherry-pick foo..bar ... .git/sequencer is created ... ... .git/CHERRY_PICK_HEAD is created ... ... conflict in bar ... $ echo "resolved" >problematicfile $ git add problematicfile $ git commit ... .git/CHERRY_PICK_HEAD is removed ... $ git cherry-pick moo error: An existing cherry-pick or revert is in progress $ git cherry-pick --continue ... .git/sequencer is removed ... # We're in pristine shape now While prematurely removing the entire sequencer state is an overkill, we can revise our plan: prematurely remove only '.git/sequencer/todo' in the 'REPLAY_PICK' case, because this is the exact case where the information in '.git/sequencer/todo' can be inferred from '.git/CHERRY_PICK_HEAD'. This will be compatible with our future plan to implement '--continue' and '--reset' consistently. Signed-off-by: Ramkumar Ramachandra <redacted> --- sequencer.c | 8 +++----- t/t3510-cherry-pick-sequence.sh | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/sequencer.c b/sequencer.c
index b35fcc7..23fd3fe 100644
--- a/sequencer.c
+++ b/sequencer.c@@ -753,15 +753,13 @@ static int pick_commits(struct replay_insn_list *todo_list, save_todo(cur); res = do_pick_commit(cur->operand, cur->action, opts); if (res) { - if (!cur->next) + if (!cur->next && opts->action == REPLAY_PICK) /* * An error was encountered while * picking the last commit; the - * sequencer state is useless now -- - * the user simply needs to resolve - * the conflict and commit + * sequencer todo is useless now. */ - remove_sequencer_state(0); + unlink(git_path(SEQ_TODO_FILE)); return res; } }
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index 4b12244..09b9e65 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh@@ -85,10 +85,10 @@ test_expect_success '--reset cleans up sequencer state' ' test_path_is_missing .git/sequencer ' -test_expect_success 'cherry-pick cleans up sequencer state when one commit is left' ' +test_expect_success 'cherry-pick cleans up sequencer todo when one commit is left' ' pristine_detach initial && test_must_fail git cherry-pick base..picked && - test_path_is_missing .git/sequencer && + test_path_is_missing .git/sequencer/todo && echo "resolved" >foo && git add foo && git commit &&
--
1.7.6.351.gb35ac.dirty