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
}