From d953c4505e09756b4b4f72b431a51867281643ca Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Sun, 28 Feb 2016 21:30:00 -0500 Subject: [PATCH] merge drivers: handle configured but not found driver --- src/merge.c | 17 +++++++++++++---- tests/merge/driver.c | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/merge.c b/src/merge.c index 27c0cea95..a0f2405ff 100644 --- a/src/merge.c +++ b/src/merge.c @@ -891,7 +891,8 @@ static int merge_conflict_resolve_contents( git_index_entry *merge_result; git_odb *odb = NULL; const char *name; - int error = 0; + bool fallback = false; + int error; assert(resolved && diff_list && conflict); @@ -924,12 +925,20 @@ static int merge_conflict_resolve_contents( /* find the merge driver for this file */ if ((error = git_merge_driver_for_source(&name, &driver, &source)) < 0) goto done; + + if (driver == NULL) + fallback = true; } - error = merge_conflict_invoke_driver(&merge_result, name, driver, - diff_list, &source); + if (driver) { + error = merge_conflict_invoke_driver(&merge_result, name, driver, + diff_list, &source); - if (error == GIT_PASSTHROUGH) { + if (error == GIT_PASSTHROUGH) + fallback = true; + } + + if (fallback) { error = merge_conflict_invoke_driver(&merge_result, "text", &git_merge_driver__text.base, diff_list, &source); } diff --git a/tests/merge/driver.c b/tests/merge/driver.c index 670c2c482..c75a00742 100644 --- a/tests/merge/driver.c +++ b/tests/merge/driver.c @@ -368,3 +368,21 @@ void test_merge_driver__unset_forces_binary(void) cl_git_pass(git_index_conflict_get(&ancestor, &ours, &theirs, repo_index, "automergeable.txt")); } + +void test_merge_driver__not_configured_driver_falls_back(void) +{ + const git_index_entry *idx; + + test_drivers_unregister(); + + /* `merge` without specifying a driver indicates `text` */ + set_gitattributes_to("notfound"); + + merge_branch(); + + cl_assert((idx = git_index_get_bypath(repo_index, "automergeable.txt", 0))); + cl_assert_equal_oid(&automergeable_id, &idx->id); + + test_drivers_register(); +} +