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

[PATCH 5/7] merge-recursive: add merge function arg to 'merge_recursive_generic'

From
Victoria Dye via GitGitGadget <gitgitgadget@gmail.com>
Date
Apr 25, 2022, 17:49 UTC
Message-ID
<80c25c7587484ca32afcfd6cc054eab78dd1348a.1650908958.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1171.git.1650908957.gitgitgadget@gmail.com>
From: Victoria Dye <vdye@github.com>

Replace the hardcoded 'merge_recursive()' function used by the 'merge_recursive_generic()' with a caller-specific merge function. This will allow us to use 'merge_ort_recursive()' (and therefore avoid the index expansion of 'merge_recursive()') in commands that perform merges with 'merge_recursive_generic()', such as 'git stash pop'.

Note that this patch is strictly a refactor; all callers still use 'merge_recursive()', and any changing to 'merge_ort_recursive()' will be done in a later commit.

Signed-off-by: Victoria Dye <vdye@github.com>
---
 builtin/am.c              | 2 +-
 builtin/merge-recursive.c | 2 +-
 builtin/stash.c           | 2 +-
 merge-ort.c               | 3 ++-
 merge-recursive.c         | 4 ++--
 merge-recursive.h         | 9 ++++++++-
 6 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/builtin/am.c b/builtin/am.c
index 0f4111bafa0..6d01185d122 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1614,7 +1614,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 	if (state->quiet)
 		o.verbosity = 0;
 
-	if (merge_recursive_generic(&o, &our_tree, &their_tree, 1, bases, &result)) {
+	if (merge_recursive_generic(&o, &our_tree, &their_tree, 1, bases, merge_recursive, &result)) {
 		repo_rerere(the_repository, state->allow_rerere_autoupdate);
 		free(their_tree_name);
 		return error(_("Failed to merge in the changes."));
diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c
index b9acbf5d342..687ed1e527b 100644
--- a/builtin/merge-recursive.c
+++ b/builtin/merge-recursive.c
@@ -81,7 +81,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
 	if (o.verbosity >= 3)
 		printf(_("Merging %s with %s\n"), o.branch1, o.branch2);
 
-	failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result);
+	failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, merge_recursive, &result);
 
 	free(better1);
 	free(better2);
diff --git a/builtin/stash.c b/builtin/stash.c
index 1bfba532044..16171eb1dab 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -554,7 +554,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
 	bases[0] = &info->b_tree;
 
 	ret = merge_recursive_generic(&o, &c_tree, &info->w_tree, 1, bases,
-				      &result);
+				      merge_recursive, &result);
 	if (ret) {
 		rerere(0);
 
diff --git a/merge-ort.c b/merge-ort.c
index 8545354dafd..4bccdfcf355 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -4737,7 +4737,8 @@ void merge_incore_recursive(struct merge_options *opt,
 	trace2_region_enter("merge", "incore_recursive", opt->repo);
 
 	/* We set the ancestor label based on the merge_bases */
-	assert(opt->ancestor == NULL);
+	assert(opt->ancestor == NULL ||
+	       !strcmp(opt->ancestor, "constructed merge base"));
 
 	trace2_region_enter("merge", "merge_start", opt->repo);
 	merge_start(opt, result);
diff --git a/merge-recursive.c b/merge-recursive.c
index 1ee6364e8b1..2088f5c5fb3 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -3806,6 +3806,7 @@ int merge_recursive_generic(struct merge_options *opt,
 			    const struct object_id *merge,
 			    int num_merge_bases,
 			    const struct object_id **merge_bases,
+			    recursive_merge_fn_t merge_fn,
 			    struct commit **result)
 {
 	int clean;
@@ -3829,8 +3830,7 @@ int merge_recursive_generic(struct merge_options *opt,
 	}
 
 	repo_hold_locked_index(opt->repo, &lock, LOCK_DIE_ON_ERROR);
-	clean = merge_recursive(opt, head_commit, next_commit, ca,
-				result);
+	clean = merge_fn(opt, head_commit, next_commit, ca, result);
 	if (clean < 0) {
 		rollback_lock_file(&lock);
 		return clean;
diff --git a/merge-recursive.h b/merge-recursive.h
index b88000e3c25..6a21f2da538 100644
--- a/merge-recursive.h
+++ b/merge-recursive.h
@@ -53,6 +53,12 @@ struct merge_options {
 	struct merge_options_internal *priv;
 };
 
+typedef int (*recursive_merge_fn_t)(struct merge_options *opt,
+				    struct commit *h1,
+				    struct commit *h2,
+				    struct commit_list *merge_bases,
+				    struct commit **result);
+
 void init_merge_options(struct merge_options *opt, struct repository *repo);
 
 /* parse the option in s and update the relevant field of opt */
@@ -105,7 +111,7 @@ int merge_recursive(struct merge_options *opt,
 
 /*
  * merge_recursive_generic can operate on trees instead of commits, by
- * wrapping the trees into virtual commits, and calling merge_recursive().
+ * wrapping the trees into virtual commits, and calling the provided merge_fn.
  * It also writes out the in-memory index to disk if the merge is successful.
  *
  * Outputs:
@@ -120,6 +126,7 @@ int merge_recursive_generic(struct merge_options *opt,
 			    const struct object_id *merge,
 			    int num_merge_bases,
 			    const struct object_id **merge_bases,
+			    recursive_merge_fn_t merge_fn,
 			    struct commit **result);
 
 #endif
-- 
gitgitgadget
Previous: Junio C HamanoNext: Junio C Hamano
Message 14 of 42 in “Sparse index: integrate with 'git stash'”
  1. 0/7 Sparse index: integrate with 'git stash'Victoria Dye via GitGitGadget, Apr 25, 2022
  2. 1/7 stash: expand sparse-checkout compatibility testingVictoria Dye via GitGitGadget, Apr 25, 2022
  3. 3/7 sparse-index: expose 'is_sparse_index_allowed()'Victoria Dye via GitGitGadget, Apr 25, 2022
  4. 7/7 unpack-trees: preserve index sparsityVictoria Dye via GitGitGadget, Apr 25, 2022
  5. 6/7 stash: merge applied stash with merge-ortVictoria Dye via GitGitGadget, Apr 25, 2022
  6. Derrick StoleeApr 26, 2022
  7. 4/7 read-cache: set sparsity when index is newVictoria Dye via GitGitGadget, Apr 25, 2022
  8. Junio C HamanoApr 25, 2022
  9. 2/7 stash: integrate with sparse indexVictoria Dye via GitGitGadget, Apr 25, 2022
  10. Junio C HamanoApr 25, 2022
  11. Derrick StoleeApr 26, 2022
  12. Victoria DyeApr 26, 2022
  13. Junio C HamanoApr 26, 2022
  14. 5/7 merge-recursive: add merge function arg to 'merge_recursive_generic'Victoria Dye via GitGitGadget, Apr 25, 2022
  15. Junio C HamanoApr 25, 2022
  16. Derrick StoleeApr 26, 2022
  17. Derrick StoleeApr 26, 2022
  18. Derrick StoleeApr 26, 2022
  19. 0/7 Sparse index: integrate with 'git stash'Victoria Dye via GitGitGadget, Apr 27, 2022
  20. 1/7 stash: expand sparse-checkout compatibility testingVictoria Dye via GitGitGadget, Apr 27, 2022
  21. 2/7 stash: integrate with sparse indexVictoria Dye via GitGitGadget, Apr 27, 2022
  22. 3/7 sparse-index: expose 'is_sparse_index_allowed()'Victoria Dye via GitGitGadget, Apr 27, 2022
  23. 4/7 read-cache: set sparsity when index is newVictoria Dye via GitGitGadget, Apr 27, 2022
  24. 6/7 stash: merge applied stash with merge-ortVictoria Dye via GitGitGadget, Apr 27, 2022
  25. 7/7 unpack-trees: preserve index sparsityVictoria Dye via GitGitGadget, Apr 27, 2022
  26. 5/7 merge-recursive: add merge function arg to 'merge_recursive_generic'Victoria Dye via GitGitGadget, Apr 27, 2022
  27. Elijah NewrenMay 6, 2022
  28. Victoria DyeMay 9, 2022
  29. Elijah NewrenMay 10, 2022
  30. Elijah NewrenMay 6, 2022
  31. 0/6 Sparse index: integrate with 'git stash'Victoria Dye via GitGitGadget, May 10, 2022
  32. 1/6 stash: expand sparse-checkout compatibility testingVictoria Dye via GitGitGadget, May 10, 2022
  33. 2/6 stash: integrate with sparse indexVictoria Dye via GitGitGadget, May 10, 2022
  34. 3/6 sparse-index: expose 'is_sparse_index_allowed()'Victoria Dye via GitGitGadget, May 10, 2022
  35. 4/6 read-cache: set sparsity when index is newVictoria Dye via GitGitGadget, May 10, 2022
  36. 5/6 stash: apply stash using 'merge_ort_nonrecursive()'Victoria Dye via GitGitGadget, May 10, 2022
  37. Junio C HamanoMay 11, 2022
  38. Jonathan TanMay 12, 2022
  39. Elijah NewrenMay 12, 2022
  40. Jonathan TanMay 12, 2022
  41. Elijah NewrenMay 12, 2022
  42. 6/6 unpack-trees: preserve index sparsityVictoria Dye via GitGitGadget, May 10, 2022

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.