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

[PATCH 12/18] revert: Make pick_commits functionally act on a commit list

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Aug 1, 2011, 18:06 UTC
Message-ID
<1312222025-28453-13-git-send-email-artagnon@gmail.com>
In-Reply-To
<1312222025-28453-1-git-send-email-artagnon@gmail.com>

Apart from its central objective of calling into the picking mechanism, pick_commits creates a sequencer directory, prepares a todo list, and even acts upon the "--reset" subcommand. This makes for a bad API since the central worry of callers is to figure out whether or not any conflicts were encountered during the cherry picking. The current API is like:

  if (pick_commits(opts) < 0)
     print "Something failed, we're not sure what"

So, change pick_commits so that it's only responsible for picking commits in a loop and reporting any errors, leaving the rest to a new function called pick_revisions. Consequently, the API of pick_commits becomes much clearer:

  act_on_subcommand(opts->subcommand);
  todo_list = prepare_todo_list();
  if (pick_commits(todo_list, opts) < 0)
     print "Error encountered while picking commits"

Now, callers can easily call-in to the cherry-picking machinery by constructing an arbitrary todo list along with some options.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin/revert.c |   43 ++++++++++++++++++++++++++++---------------
 1 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index 7aa0aaf..cc130e0 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -729,11 +729,9 @@ static void save_opts(struct replay_opts *opts)
 	}
 }
 
-static int pick_commits(struct replay_opts *opts)
+static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts)
 {
-	struct commit_list *todo_list = NULL;
 	struct strbuf buf = STRBUF_INIT;
-	unsigned char sha1[20];
 	struct commit_list *cur;
 	int res;
 
@@ -743,16 +741,6 @@ static int pick_commits(struct replay_opts *opts)
 				opts->record_origin || opts->edit));
 	read_and_refresh_cache(opts);
 
-	walk_revs_populate_todo(&todo_list, opts);
-	create_seq_dir();
-	if (get_sha1("HEAD", sha1)) {
-		if (opts->action == REVERT)
-			die(_("Can't revert as initial commit"));
-		die(_("Can't cherry-pick into empty head"));
-	}
-	save_head(sha1_to_hex(sha1));
-	save_opts(opts);
-
 	for (cur = todo_list; cur; cur = cur->next) {
 		save_todo(cur, opts);
 		res = do_pick_commit(cur->item, opts);
@@ -770,6 +758,31 @@ static int pick_commits(struct replay_opts *opts)
 	return 0;
 }
 
+static int pick_revisions(struct replay_opts *opts)
+{
+	struct commit_list *todo_list = NULL;
+	unsigned char sha1[20];
+
+	read_and_refresh_cache(opts);
+
+	/*
+	 * Decide what to do depending on the arguments; a fresh
+	 * cherry-pick should be handled differently from an existing
+	 * one that is being continued
+	 */
+	walk_revs_populate_todo(&todo_list, opts);
+	create_seq_dir();
+	if (get_sha1("HEAD", sha1)) {
+		if (opts->action == REVERT)
+			die(_("Can't revert as initial commit"));
+		die(_("Can't cherry-pick into empty head"));
+	}
+	save_head(sha1_to_hex(sha1));
+	save_opts(opts);
+
+	return pick_commits(todo_list, opts);
+}
+
 int cmd_revert(int argc, const char **argv, const char *prefix)
 {
 	struct replay_opts opts;
@@ -780,7 +793,7 @@ int cmd_revert(int argc, const char **argv, const char *prefix)
 	opts.action = REVERT;
 	git_config(git_default_config, NULL);
 	parse_args(argc, argv, &opts);
-	return pick_commits(&opts);
+	return pick_revisions(&opts);
 }
 
 int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
@@ -791,5 +804,5 @@ int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
 	opts.action = CHERRY_PICK;
 	git_config(git_default_config, NULL);
 	parse_args(argc, argv, &opts);
-	return pick_commits(&opts);
+	return pick_revisions(&opts);
 }
-- 
1.7.4.rc1.7.g2cf08.dirty
Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 18 of 33 in “Sequencer for inclusion”
  1. 00/18 Sequencer for inclusionRamkumar Ramachandra, Aug 1, 2011
  2. 01/18 advice: Introduce error_resolve_conflictRamkumar Ramachandra, Aug 1, 2011
  3. 02/18 config: Introduce functions to write non-standard fileRamkumar Ramachandra, Aug 1, 2011
  4. 03/18 revert: Simplify and inline add_message_to_msgRamkumar Ramachandra, Aug 1, 2011
  5. 04/18 revert: Don't check lone argument in get_encodingRamkumar Ramachandra, Aug 1, 2011
  6. 05/18 revert: Rename no_replay to record_originRamkumar Ramachandra, Aug 1, 2011
  7. 06/18 revert: Eliminate global "commit" variableRamkumar Ramachandra, Aug 1, 2011
  8. 07/18 revert: Introduce struct to keep command-line optionsRamkumar Ramachandra, Aug 1, 2011
  9. 08/18 revert: Separate cmdline parsing from functional codeRamkumar Ramachandra, Aug 1, 2011
  10. 09/18 revert: Don't create invalid replay_opts in parse_argsRamkumar Ramachandra, Aug 1, 2011
  11. Christian CouderAug 2, 2011
  12. Christian CouderAug 2, 2011
  13. Ramkumar RamachandraAug 4, 2011
  14. 10/18 revert: Save data for continuing after conflict resolutionRamkumar Ramachandra, Aug 1, 2011
  15. 11/18 revert: Save command-line options for continuing operationRamkumar Ramachandra, Aug 1, 2011
  16. Christian CouderAug 4, 2011
  17. Ramkumar RamachandraAug 4, 2011
  18. 12/18 revert: Make pick_commits functionally act on a commit listRamkumar Ramachandra, Aug 1, 2011
  19. 13/18 revert: Introduce --reset to remove sequencer stateRamkumar Ramachandra, Aug 1, 2011
  20. 14/18 reset: Make reset remove the sequencer stateRamkumar Ramachandra, Aug 1, 2011
  21. 15/18 revert: Remove sequencer state when no commits are pendingRamkumar Ramachandra, Aug 1, 2011
  22. 16/18 revert: Don't implicitly stomp pending sequencer operationRamkumar Ramachandra, Aug 1, 2011
  23. 17/18 revert: Introduce --continue to continue the operationRamkumar Ramachandra, Aug 1, 2011
  24. Ramkumar RamachandraAug 1, 2011
  25. Christian CouderAug 2, 2011
  26. Christian CouderAug 2, 2011
  27. Christian CouderAug 2, 2011
  28. Ramkumar RamachandraAug 2, 2011
  29. Ramkumar RamachandraAug 4, 2011
  30. Christian CouderAug 2, 2011
  31. Christian CouderAug 4, 2011
  32. Ramkumar RamachandraAug 4, 2011
  33. 18/18 revert: Propagate errors upwards from do_pick_commitRamkumar Ramachandra, Aug 1, 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.