Skip to content

Commit cd1d61c

Browse files
bertwesarggitster
authored andcommitted
make union merge an xdl merge favor
The current union merge driver is implemented as an post process. But the xdl_merge code is quite capable to produce the result by itself. Therefore move it there. Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent e923eae commit cd1d61c

File tree

3 files changed

+19
-45
lines changed

3 files changed

+19
-45
lines changed

ll-merge.c

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -98,44 +98,11 @@ static int ll_union_merge(const struct ll_merge_driver *drv_unused,
9898
mmfile_t *src2, const char *name2,
9999
int flag, int marker_size)
100100
{
101-
char *src, *dst;
102-
long size;
103-
int status, saved_style;
104-
105-
/* We have to force the RCS "merge" style */
106-
saved_style = git_xmerge_style;
107-
git_xmerge_style = 0;
108-
status = ll_xdl_merge(drv_unused, result, path_unused,
109-
orig, src1, NULL, src2, NULL,
110-
flag, marker_size);
111-
git_xmerge_style = saved_style;
112-
if (status <= 0)
113-
return status;
114-
size = result->size;
115-
src = dst = result->ptr;
116-
while (size) {
117-
char ch;
118-
if ((marker_size < size) &&
119-
(*src == '<' || *src == '=' || *src == '>')) {
120-
int i;
121-
ch = *src;
122-
for (i = 0; i < marker_size; i++)
123-
if (src[i] != ch)
124-
goto not_a_marker;
125-
if (src[marker_size] != '\n')
126-
goto not_a_marker;
127-
src += marker_size + 1;
128-
size -= marker_size + 1;
129-
continue;
130-
}
131-
not_a_marker:
132-
do {
133-
ch = *src++;
134-
*dst++ = ch;
135-
size--;
136-
} while (ch != '\n' && size);
137-
}
138-
result->size = dst - result->ptr;
101+
/* Use union favor */
102+
flag = (flag & 1) | (XDL_MERGE_FAVOR_UNION << 1);
103+
return ll_xdl_merge(drv_unused, result, path_unused,
104+
orig, src1, NULL, src2, NULL,
105+
flag, marker_size);
139106
return 0;
140107
}
141108

xdiff/xdiff.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ extern "C" {
6161
/* merge favor modes */
6262
#define XDL_MERGE_FAVOR_OURS 1
6363
#define XDL_MERGE_FAVOR_THEIRS 2
64+
#define XDL_MERGE_FAVOR_UNION 3
6465
#define XDL_MERGE_FAVOR(flags) (((flags)>>4) & 3)
6566
#define XDL_MERGE_FLAGS(level, style, favor) ((level)|(style)|((favor)<<4))
6667

xdiff/xmerge.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ typedef struct s_xdmerge {
2828
* 0 = conflict,
2929
* 1 = no conflict, take first,
3030
* 2 = no conflict, take second.
31+
* 3 = no conflict, take both.
3132
*/
3233
int mode;
3334
/*
@@ -230,14 +231,19 @@ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
230231
size = fill_conflict_hunk(xe1, name1, xe2, name2,
231232
size, i, style, m, dest,
232233
marker_size);
233-
else if (m->mode == 1)
234-
size += xdl_recs_copy(xe1, i, m->i1 + m->chg1 - i, 0,
234+
else if (m->mode & 3) {
235+
/* Before conflicting part */
236+
size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
235237
dest ? dest + size : NULL);
236-
else if (m->mode == 2)
237-
size += xdl_recs_copy(xe2, m->i2 - m->i1 + i,
238-
m->i1 + m->chg2 - i, 0,
239-
dest ? dest + size : NULL);
240-
else
238+
/* Postimage from side #1 */
239+
if (m->mode & 1)
240+
size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
241+
dest ? dest + size : NULL);
242+
/* Postimage from side #2 */
243+
if (m->mode & 2)
244+
size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
245+
dest ? dest + size : NULL);
246+
} else
241247
continue;
242248
i = m->i1 + m->chg1;
243249
}

0 commit comments

Comments
 (0)