summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@github.com>2016-02-28 21:30:00 -0500
committerEdward Thomson <ethomson@github.com>2016-03-17 11:06:00 -0400
commitd953c4505e09756b4b4f72b431a51867281643ca (patch)
tree856d273d42eec43a6670fcda7eb38b1a1bc3f90c
parent6d8b2cdbee00f2c4e97796b52e05dd39bd655138 (diff)
downloadlibgit2-d953c4505e09756b4b4f72b431a51867281643ca.tar.gz
merge drivers: handle configured but not found driver
-rw-r--r--src/merge.c17
-rw-r--r--tests/merge/driver.c18
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)
+ fallback = true;
+ }
- if (error == GIT_PASSTHROUGH) {
+ 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();
+}
+