"zdiff3" is identical to ordinary diff3, only it allows more aggressive
compaction than diff3. This way the displayed base isn't necessary
technically correct, but still this mode might help resolving merge
conflicts between two near identical additions.

Signed-off-by: Uwe Kleine-König <u.kleine-koe...@pengutronix.de>
---
Hello,

this patch implements what I want. Thanks to Jeff for pointing me to the
right code to modify.

Best regards
Uwe

 builtin/merge-file.c                   | 2 ++
 contrib/completion/git-completion.bash | 2 +-
 xdiff-interface.c                      | 2 ++
 xdiff/xdiff.h                          | 1 +
 xdiff/xmerge.c                         | 8 +++++++-
 5 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index c0570f2..4ef86aa 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -32,6 +32,8 @@ int cmd_merge_file(int argc, const char **argv, const char 
*prefix)
        struct option options[] = {
                OPT_BOOLEAN('p', "stdout", &to_stdout, N_("send results to 
standard output")),
                OPT_SET_INT(0, "diff3", &xmp.style, N_("use a diff3 based 
merge"), XDL_MERGE_DIFF3),
+               OPT_SET_INT(0, "zdiff3", &xmp.style, N_("use a zealous diff3 
based merge"),
+                               XDL_MERGE_ZEALOUS_DIFF3),
                OPT_SET_INT(0, "ours", &xmp.favor, N_("for conflicts, use our 
version"),
                            XDL_MERGE_FAVOR_OURS),
                OPT_SET_INT(0, "theirs", &xmp.favor, N_("for conflicts, use 
their version"),
diff --git a/contrib/completion/git-completion.bash 
b/contrib/completion/git-completion.bash
index b62bec0..a0d887e 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1091,7 +1091,7 @@ _git_checkout ()
 
        case "$cur" in
        --conflict=*)
-               __gitcomp "diff3 merge" "" "${cur##--conflict=}"
+               __gitcomp "diff3 merge zdiff3" "" "${cur##--conflict=}"
                ;;
        --*)
                __gitcomp "
diff --git a/xdiff-interface.c b/xdiff-interface.c
index ecfa05f..a911c25 100644
--- a/xdiff-interface.c
+++ b/xdiff-interface.c
@@ -308,6 +308,8 @@ int git_xmerge_config(const char *var, const char *value, 
void *cb)
                        die("'%s' is not a boolean", var);
                if (!strcmp(value, "diff3"))
                        git_xmerge_style = XDL_MERGE_DIFF3;
+               else if (!strcmp(value, "zdiff3"))
+                       git_xmerge_style = XDL_MERGE_ZEALOUS_DIFF3;
                else if (!strcmp(value, "merge"))
                        git_xmerge_style = 0;
                else
diff --git a/xdiff/xdiff.h b/xdiff/xdiff.h
index 219a3bb..9730c63 100644
--- a/xdiff/xdiff.h
+++ b/xdiff/xdiff.h
@@ -64,6 +64,7 @@ extern "C" {
 
 /* merge output styles */
 #define XDL_MERGE_DIFF3 1
+#define XDL_MERGE_ZEALOUS_DIFF3 2
 
 typedef struct s_mmfile {
        char *ptr;
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index 9e13b25..4772707 100644
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
@@ -177,7 +177,7 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char 
*name1,
        size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
                              dest ? dest + size : NULL);
 
-       if (style == XDL_MERGE_DIFF3) {
+       if (style == XDL_MERGE_DIFF3 || style == XDL_MERGE_ZEALOUS_DIFF3) {
                /* Shared preimage */
                if (!dest) {
                        size += marker_size + 1 + marker3_size;
@@ -420,6 +420,12 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
        int style = xmp->style;
        int favor = xmp->favor;
 
+       /*
+        * This is the only change between XDL_MERGE_DIFF3 and
+        * XDL_MERGE_ZEALOUS_DIFF3. "zdiff3" isn't 100% technically correct (as
+        * the base might be considerably simplified), but still it might help
+        * interpreting conflicts between two big and near identical additions.
+        */
        if (style == XDL_MERGE_DIFF3) {
                /*
                 * "diff3 -m" output does not make sense for anything
-- 
1.8.2.rc2

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to