diff options
author | Edward Thomson <ethomson@github.com> | 2016-02-28 21:30:00 -0500 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-03-17 11:06:00 -0400 |
commit | d953c4505e09756b4b4f72b431a51867281643ca (patch) | |
tree | 856d273d42eec43a6670fcda7eb38b1a1bc3f90c | |
parent | 6d8b2cdbee00f2c4e97796b52e05dd39bd655138 (diff) | |
download | libgit2-d953c4505e09756b4b4f72b431a51867281643ca.tar.gz |
merge drivers: handle configured but not found driver
-rw-r--r-- | src/merge.c | 17 | ||||
-rw-r--r-- | 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) + 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(); +} + |