Skip to content

Commit 45a86bb

Browse files
committed
Allow for merges with whitespace discrepancies
1 parent d675982 commit 45a86bb

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

include/git2/merge.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,23 @@ typedef enum {
110110
GIT_MERGE_FILE_FAVOR_UNION = 3,
111111
} git_merge_file_favor_t;
112112

113+
/**
114+
* Whitespace merging flags
115+
*/
116+
typedef enum {
117+
/** Defaults */
118+
GIT_MERGE_FILE_IGNORE_DEFAULT = 0,
119+
120+
/** Ignore all whitespace */
121+
GIT_MERGE_FILE_IGNORE_WHITESPACE = (1 << 0),
122+
123+
/** Ignore changes in amount of whitespace */
124+
GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE = (1 << 1),
125+
126+
/** Ignore whitespace at end of line */
127+
GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL = (1 << 2),
128+
} git_merge_file_whitespace_t;
129+
113130
/**
114131
* File merging flags
115132
*/
@@ -156,6 +173,9 @@ typedef struct {
156173

157174
/** Merge file flags. */
158175
git_merge_file_flags_t flags;
176+
177+
/** Whitespace merge flags */
178+
unsigned int whitespace_flags;
159179
} git_merge_file_options;
160180

161181
#define GIT_MERGE_FILE_OPTIONS_VERSION 1
@@ -230,6 +250,9 @@ typedef struct {
230250

231251
/** Flags for handling conflicting content. */
232252
git_merge_file_favor_t file_favor;
253+
254+
/** Flags for handling whitespace */
255+
unsigned int whitespace_flags;
233256
} git_merge_options;
234257

235258
#define GIT_MERGE_OPTIONS_VERSION 1

src/merge.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,8 @@ static int merge_conflict_resolve_automerge(
653653
int *resolved,
654654
git_merge_diff_list *diff_list,
655655
const git_merge_diff *conflict,
656-
unsigned int merge_file_favor)
656+
unsigned int merge_file_favor,
657+
unsigned int whitespace_flags)
657658
{
658659
const git_index_entry *ancestor = NULL, *ours = NULL, *theirs = NULL;
659660
git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT;
@@ -708,6 +709,7 @@ static int merge_conflict_resolve_automerge(
708709
&conflict->their_entry : NULL;
709710

710711
opts.favor = merge_file_favor;
712+
opts.whitespace_flags = whitespace_flags;
711713

712714
if ((error = git_repository_odb(&odb, diff_list->repo)) < 0 ||
713715
(error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, &opts)) < 0 ||
@@ -741,7 +743,8 @@ static int merge_conflict_resolve(
741743
int *out,
742744
git_merge_diff_list *diff_list,
743745
const git_merge_diff *conflict,
744-
unsigned int merge_file_favor)
746+
unsigned int merge_file_favor,
747+
unsigned int whitespace_flags)
745748
{
746749
int resolved = 0;
747750
int error = 0;
@@ -757,7 +760,8 @@ static int merge_conflict_resolve(
757760
if (!resolved && (error = merge_conflict_resolve_one_renamed(&resolved, diff_list, conflict)) < 0)
758761
goto done;
759762

760-
if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, merge_file_favor)) < 0)
763+
if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict,
764+
merge_file_favor, whitespace_flags)) < 0)
761765
goto done;
762766

763767
*out = resolved;
@@ -1779,7 +1783,7 @@ int git_merge_trees(
17791783
git_vector_foreach(&changes, i, conflict) {
17801784
int resolved = 0;
17811785

1782-
if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor)) < 0)
1786+
if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.whitespace_flags)) < 0)
17831787
goto done;
17841788

17851789
if (!resolved)

src/merge_file.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,13 @@ static int git_merge_file__from_inputs(
151151
if (options.flags & GIT_MERGE_FILE_STYLE_DIFF3)
152152
xmparam.style = XDL_MERGE_DIFF3;
153153

154+
if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE)
155+
xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE;
156+
if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE)
157+
xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_CHANGE;
158+
if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL)
159+
xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_AT_EOL;
160+
154161
if ((xdl_result = xdl_merge(&ancestor_mmfile, &our_mmfile,
155162
&their_mmfile, &xmparam, &mmbuffer)) < 0) {
156163
giterr_set(GITERR_MERGE, "Failed to merge files.");

0 commit comments

Comments
 (0)