summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: e923eae)
raw | patch | inline | side by side (parent: e923eae)
author | Bert Wesarg <bert.wesarg@googlemail.com> | |
Mon, 1 Mar 2010 21:46:25 +0000 (22:46 +0100) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Tue, 2 Mar 2010 19:43:40 +0000 (11:43 -0800) |
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>
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>
ll-merge.c | patch | blob | history | |
xdiff/xdiff.h | patch | blob | history | |
xdiff/xmerge.c | patch | blob | history |
diff --git a/ll-merge.c b/ll-merge.c
index 4c7f11ba84c67089dce7d725d87a4dd32a245c7f..a4b2f4c964cd308bda05755cd83a047fd64e802e 100644 (file)
--- a/ll-merge.c
+++ b/ll-merge.c
mmfile_t *src2, const char *name2,
int flag, int marker_size)
{
- char *src, *dst;
- long size;
- int status, saved_style;
-
- /* We have to force the RCS "merge" style */
- saved_style = git_xmerge_style;
- git_xmerge_style = 0;
- status = ll_xdl_merge(drv_unused, result, path_unused,
- orig, src1, NULL, src2, NULL,
- flag, marker_size);
- git_xmerge_style = saved_style;
- if (status <= 0)
- return status;
- size = result->size;
- src = dst = result->ptr;
- while (size) {
- char ch;
- if ((marker_size < size) &&
- (*src == '<' || *src == '=' || *src == '>')) {
- int i;
- ch = *src;
- for (i = 0; i < marker_size; i++)
- if (src[i] != ch)
- goto not_a_marker;
- if (src[marker_size] != '\n')
- goto not_a_marker;
- src += marker_size + 1;
- size -= marker_size + 1;
- continue;
- }
- not_a_marker:
- do {
- ch = *src++;
- *dst++ = ch;
- size--;
- } while (ch != '\n' && size);
- }
- result->size = dst - result->ptr;
+ /* Use union favor */
+ flag = (flag & 1) | (XDL_MERGE_FAVOR_UNION << 1);
+ return ll_xdl_merge(drv_unused, result, path_unused,
+ orig, src1, NULL, src2, NULL,
+ flag, marker_size);
return 0;
}
diff --git a/xdiff/xdiff.h b/xdiff/xdiff.h
index 3f6229edbeb21bb1ca0c423d88390f3b5a05b5a2..22614d56ed0dac646027b8f51cfc70231c6c6532 100644 (file)
--- a/xdiff/xdiff.h
+++ b/xdiff/xdiff.h
/* merge favor modes */
#define XDL_MERGE_FAVOR_OURS 1
#define XDL_MERGE_FAVOR_THEIRS 2
+#define XDL_MERGE_FAVOR_UNION 3
#define XDL_MERGE_FAVOR(flags) (((flags)>>4) & 3)
#define XDL_MERGE_FLAGS(level, style, favor) ((level)|(style)|((favor)<<4))
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index 8cbe45e6755487dbe3759398375a11d05f6d91bc..c901ecb99c3369febcd7b8f66c3ededf31fc59ea 100644 (file)
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
* 0 = conflict,
* 1 = no conflict, take first,
* 2 = no conflict, take second.
+ * 3 = no conflict, take both.
*/
int mode;
/*
size = fill_conflict_hunk(xe1, name1, xe2, name2,
size, i, style, m, dest,
marker_size);
- else if (m->mode == 1)
- size += xdl_recs_copy(xe1, i, m->i1 + m->chg1 - i, 0,
+ else if (m->mode & 3) {
+ /* Before conflicting part */
+ size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
dest ? dest + size : NULL);
- else if (m->mode == 2)
- size += xdl_recs_copy(xe2, m->i2 - m->i1 + i,
- m->i1 + m->chg2 - i, 0,
- dest ? dest + size : NULL);
- else
+ /* Postimage from side #1 */
+ if (m->mode & 1)
+ size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
+ dest ? dest + size : NULL);
+ /* Postimage from side #2 */
+ if (m->mode & 2)
+ size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
+ dest ? dest + size : NULL);
+ } else
continue;
i = m->i1 + m->chg1;
}