summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2015-03-18 13:17:04 -0400
committerEdward Thomson <ethomson@edwardthomson.com>2015-03-18 13:17:04 -0400
commit89ba9f1acc7d6f26ce45a6ccd128a2c270a5fe79 (patch)
tree523e5c8b37fc1acf9fb9779a8a29140ea64f2787 /src
parent7568bdf4abf8c99c4bf0a87ff4ce6967c333e70a (diff)
parent70b0f128c8f8a9f6bd2ec4ec0b326f8c03f9efb4 (diff)
downloadlibgit2-89ba9f1acc7d6f26ce45a6ccd128a2c270a5fe79.tar.gz
Merge pull request #2967 from jacquesg/merge-whitespace
Allow merges of files (and trees) with whitespace problems/fixes
Diffstat (limited to 'src')
-rw-r--r--src/merge.c16
-rw-r--r--src/merge_file.c13
2 files changed, 23 insertions, 6 deletions
diff --git a/src/merge.c b/src/merge.c
index 449a17853..bd676aacf 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -658,7 +658,8 @@ static int merge_conflict_resolve_automerge(
int *resolved,
git_merge_diff_list *diff_list,
const git_merge_diff *conflict,
- unsigned int merge_file_favor)
+ unsigned int merge_file_favor,
+ unsigned int file_flags)
{
const git_index_entry *ancestor = NULL, *ours = NULL, *theirs = NULL;
git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT;
@@ -716,6 +717,7 @@ static int merge_conflict_resolve_automerge(
&conflict->their_entry : NULL;
opts.favor = merge_file_favor;
+ opts.flags = file_flags;
if ((error = git_repository_odb(&odb, diff_list->repo)) < 0 ||
(error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, &opts)) < 0 ||
@@ -749,7 +751,8 @@ static int merge_conflict_resolve(
int *out,
git_merge_diff_list *diff_list,
const git_merge_diff *conflict,
- unsigned int merge_file_favor)
+ unsigned int merge_file_favor,
+ unsigned int file_flags)
{
int resolved = 0;
int error = 0;
@@ -765,7 +768,8 @@ static int merge_conflict_resolve(
if (!resolved && (error = merge_conflict_resolve_one_renamed(&resolved, diff_list, conflict)) < 0)
goto done;
- if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, merge_file_favor)) < 0)
+ if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict,
+ merge_file_favor, file_flags)) < 0)
goto done;
*out = resolved;
@@ -1158,7 +1162,7 @@ int git_merge_diff_list__find_renames(
assert(diff_list && opts);
- if ((opts->flags & GIT_MERGE_TREE_FIND_RENAMES) == 0)
+ if ((opts->tree_flags & GIT_MERGE_TREE_FIND_RENAMES) == 0)
return 0;
similarity_ours = git__calloc(diff_list->conflicts.length,
@@ -1600,7 +1604,7 @@ static int merge_normalize_opts(
git_merge_options init = GIT_MERGE_OPTIONS_INIT;
memcpy(opts, &init, sizeof(init));
- opts->flags = GIT_MERGE_TREE_FIND_RENAMES;
+ opts->tree_flags = GIT_MERGE_TREE_FIND_RENAMES;
opts->rename_threshold = GIT_MERGE_TREE_RENAME_THRESHOLD;
}
@@ -1790,7 +1794,7 @@ int git_merge_trees(
git_vector_foreach(&changes, i, conflict) {
int resolved = 0;
- if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor)) < 0)
+ if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.file_flags)) < 0)
goto done;
if (!resolved)
diff --git a/src/merge_file.c b/src/merge_file.c
index ff0364432..6d89b089d 100644
--- a/src/merge_file.c
+++ b/src/merge_file.c
@@ -151,6 +151,19 @@ static int git_merge_file__from_inputs(
if (options.flags & GIT_MERGE_FILE_STYLE_DIFF3)
xmparam.style = XDL_MERGE_DIFF3;
+ if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE)
+ xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE;
+ if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE)
+ xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_CHANGE;
+ if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL)
+ xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_AT_EOL;
+
+ if (options.flags & GIT_MERGE_FILE_DIFF_PATIENCE)
+ xmparam.xpp.flags |= XDF_PATIENCE_DIFF;
+
+ if (options.flags & GIT_MERGE_FILE_DIFF_MINIMAL)
+ xmparam.xpp.flags |= XDF_NEED_MINIMAL;
+
if ((xdl_result = xdl_merge(&ancestor_mmfile, &our_mmfile,
&their_mmfile, &xmparam, &mmbuffer)) < 0) {
giterr_set(GITERR_MERGE, "Failed to merge files.");