@matheusbsbs / matheus-bagliano / commits / cd1d61c44f
Fork 0

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>

Bert Wesarg committed Mar 1, 2010 at 22:46 UTC cd1d61c44fb5c3d1c8e4c19becb66d90bbb9c676
3 files changed +19 -45
ll-merge.c
+5 -38
@@ -98,44 +98,11 @@ static int ll_union_merge(const struct ll_merge_driver *drv_unused,
98 mmfile_t *src2, const char *name2,
99 int flag, int marker_size)
100 {
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);
106 return 0;
107 }
108
xdiff/xdiff.h
+1
@@ -61,6 +61,7 @@ extern "C" {
61 /* merge favor modes */
62 #define XDL_MERGE_FAVOR_OURS 1
63 #define XDL_MERGE_FAVOR_THEIRS 2
64 +#define XDL_MERGE_FAVOR_UNION 3
65 #define XDL_MERGE_FAVOR(flags) (((flags)>>4) & 3)
66 #define XDL_MERGE_FLAGS(level, style, favor) ((level)|(style)|((favor)<<4))
67
xdiff/xmerge.c
+13 -7
@@ -28,6 +28,7 @@ typedef struct s_xdmerge {
28 * 0 = conflict,
29 * 1 = no conflict, take first,
30 * 2 = no conflict, take second.
31 + * 3 = no conflict, take both.
32 */
33 int mode;
34 /*
@@ -230,14 +231,19 @@ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
231 size = fill_conflict_hunk(xe1, name1, xe2, name2,
232 size, i, style, m, dest,
233 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,
237 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
247 continue;
248 i = m->i1 + m->chg1;
249 }