Junio C Hamano [off-list ref] writes:
Linus Torvalds [off-list ref] writes:
quoted
For example, for a three-way merge, it makes sense to do the three-way
merge for the "internal" merge too. But it might be that that isn't true
for all strategies.
Yes, that is what I alluded to in one of my previous message,
but I think the "foo-recursive" idea is a good one. I was
planning to give only "3-way" or "pick ancestor" choice to
external low-level merge drivers.
But I think that is a separate issue.
The syntax is a bit different from the one you came up in your
MUA.
# a recursive merge will always just pick the ORIGINAL
# version of a file when blending - the blending will
# be done only on the final merge
[merge "blend"]
name = blend (changelog) strategy
driver = blend %A %O %B
recursive = binary
The variable merge.<<drivername>>.recursive names a different
low level merge driver to be used while performing the virtual
ancestor merge. In this example, the built-in "binary" merge
which picks 'ours' for the final round and 'origin' for the
internal merge already does what we want.
-- >8 --
[PATCH] Allow low-level driver to specify different behaviour during internal merge.
This allows [merge "drivername"] to have a variable "recursive"
that names a different low-level merge driver to be used when
merging common ancestors to come up with a virtual ancestor.
Signed-off-by: Junio C Hamano <redacted>
---
merge-recursive.c | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index 4af69d7..43d6117 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -677,6 +677,7 @@ struct ll_merge_driver {
const char *name;
const char *description;
ll_merge_fn fn;
+ const char *recursive;
struct ll_merge_driver *next;
char *cmdline;
};@@ -934,6 +935,13 @@ static int read_merge_config(const char *var, const char *value)
return 0;
}
+ if (!strcmp("recursive", ep)) {
+ if (!value)
+ return error("%s: lacks value", var);
+ fn->recursive = strdup(value);
+ return 0;
+ }
+
return 0;
}
@@ -1013,6 +1021,10 @@ static int ll_merge(mmbuffer_t *result_buf,
merge_attr = git_path_check_merge(a->path);
driver = find_ll_merge_driver(merge_attr);
+ if (index_only && driver->recursive) {
+ merge_attr = git_attr(driver->recursive, strlen(driver->recursive));
+ driver = find_ll_merge_driver(merge_attr);
+ }
merge_status = driver->fn(driver, a->path,
&orig, &src1, name1, &src2, name2,
result_buf);--
1.5.1.1.905.g4cad0