git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 15/18] revert: Remove sequencer state when no commits are pending

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Aug 4, 2011, 10:39 UTC
Message-ID
<1312454356-3070-16-git-send-email-artagnon@gmail.com>
In-Reply-To
<1312454356-3070-1-git-send-email-artagnon@gmail.com>

When cherry-pick or revert is called on a list of commits, and a conflict encountered somewhere in the middle, the data in ".git/sequencer" is required to continue the operation. However, when a conflict is encountered in the very last commit, the user will have to "continue" after resolving the conflict and committing just so that the sequencer state is removed. This is how the current "rebase -i" script works as well.

  $ git cherry-pick foo..bar
  ... conflict encountered while picking "bar" ...
  $ echo "resolved" >problematicfile
  $ git add problematicfile
  $ git commit
  $ git cherry-pick --continue # This would be a no-op

Change this so that the sequencer state is cleared when a conflict is encountered in the last commit. Incidentally, this patch makes sure that some existing tests don't break when features like "--reset" and "--continue" are implemented later in the series.

A better way to implement this feature is to get the last "git commit" to remove the sequencer state. However, that requires tighter coupling between "git commit" and the sequencer, a goal that can be pursued once the sequencer is made more general.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Acked-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin/revert.c                |   12 +++++++++++-
 t/t3510-cherry-pick-sequence.sh |   24 ++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index a8accd6..000806c 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -763,8 +763,18 @@ static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts)
 	for (cur = todo_list; cur; cur = cur->next) {
 		save_todo(cur, opts);
 		res = do_pick_commit(cur->item, opts);
-		if (res)
+		if (res) {
+			if (!cur->next)
+				/*
+				 * 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
+				 */
+				remove_sequencer_state(0);
 			return res;
+		}
 	}
 
 	/*
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index fd69865..a414086 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh
@@ -82,4 +82,28 @@ 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' '
+	pristine_detach initial &&
+	test_must_fail git cherry-pick base..picked &&
+	test_path_is_missing .git/sequencer &&
+	echo "resolved" >foo &&
+	git add foo &&
+	git commit &&
+	{
+		git rev-list HEAD |
+		git diff-tree --root --stdin |
+		sed "s/$_x40/OBJID/g"
+	} >actual &&
+	cat >expect <<-\EOF &&
+	OBJID
+	:100644 100644 OBJID OBJID M	foo
+	OBJID
+	:100644 100644 OBJID OBJID M	unrelated
+	OBJID
+	:000000 100644 OBJID OBJID A	foo
+	:000000 100644 OBJID OBJID A	unrelated
+	EOF
+	test_cmp expect actual
+'
+
 test_done
-- 
1.7.6.351.gb35ac.dirty
Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 18 of 25 in “Sequencer for inclusion v6”
  1. 00/18 Sequencer for inclusion v6Ramkumar Ramachandra, Aug 4, 2011
  2. 01/18 advice: Introduce error_resolve_conflictRamkumar Ramachandra, Aug 4, 2011
  3. 02/18 config: Introduce functions to write non-standard fileRamkumar Ramachandra, Aug 4, 2011
  4. 03/18 revert: Simplify and inline add_message_to_msgRamkumar Ramachandra, Aug 4, 2011
  5. 04/18 revert: Don't check lone argument in get_encodingRamkumar Ramachandra, Aug 4, 2011
  6. 05/18 revert: Rename no_replay to record_originRamkumar Ramachandra, Aug 4, 2011
  7. 06/18 revert: Eliminate global "commit" variableRamkumar Ramachandra, Aug 4, 2011
  8. 07/18 revert: Introduce struct to keep command-line optionsRamkumar Ramachandra, Aug 4, 2011
  9. 08/18 revert: Separate cmdline parsing from functional codeRamkumar Ramachandra, Aug 4, 2011
  10. 09/18 revert: Don't create invalid replay_opts in parse_argsRamkumar Ramachandra, Aug 4, 2011
  11. 10/18 revert: Save data for continuing after conflict resolutionRamkumar Ramachandra, Aug 4, 2011
  12. 11/18 revert: Save command-line options for continuing operationRamkumar Ramachandra, Aug 4, 2011
  13. 12/18 revert: Make pick_commits functionally act on a commit listRamkumar Ramachandra, Aug 4, 2011
  14. 13/18 revert: Introduce --reset to remove sequencer stateRamkumar Ramachandra, Aug 4, 2011
  15. 14/18 reset: Make reset remove the sequencer stateRamkumar Ramachandra, Aug 4, 2011
  16. Christian CouderAug 8, 2011
  17. Ramkumar RamachandraAug 8, 2011
  18. 15/18 revert: Remove sequencer state when no commits are pendingRamkumar Ramachandra, Aug 4, 2011
  19. 16/18 revert: Don't implicitly stomp pending sequencer operationRamkumar Ramachandra, Aug 4, 2011
  20. 17/18 revert: Introduce --continue to continue the operationRamkumar Ramachandra, Aug 4, 2011
  21. Christian CouderAug 8, 2011
  22. Ramkumar RamachandraAug 8, 2011
  23. Junio C HamanoAug 8, 2011
  24. Ramkumar RamachandraAug 9, 2011
  25. 18/18 revert: Propagate errors upwards from do_pick_commitRamkumar Ramachandra, Aug 4, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.