am -i, git-svn: use "git var GIT_PAGER"
[gitweb.git] / xdiff / xmerge.c
index 29cdbea1ee32a71fa6f6ddffb4866ec3b67d6150..1cb65a95166a8cb60af590118f59d78aa4d24b74 100644 (file)
@@ -392,6 +392,15 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1, const char *name1,
        int level = flags & XDL_MERGE_LEVEL_MASK;
        int style = flags & XDL_MERGE_STYLE_MASK;
 
+       if (style == XDL_MERGE_DIFF3) {
+               /*
+                * "diff3 -m" output does not make sense for anything
+                * more aggressive than XDL_MERGE_EAGER.
+                */
+               if (XDL_MERGE_EAGER < level)
+                       level = XDL_MERGE_EAGER;
+       }
+
        c = changes = NULL;
 
        while (xscr1 && xscr2) {
@@ -427,7 +436,7 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1, const char *name1,
                        xscr2 = xscr2->next;
                        continue;
                }
-               if (level < 1 || xscr1->i1 != xscr2->i1 ||
+               if (level == XDL_MERGE_MINIMAL || xscr1->i1 != xscr2->i1 ||
                                xscr1->chg1 != xscr2->chg1 ||
                                xscr1->chg2 != xscr2->chg2 ||
                                xdl_merge_cmp_lines(xe1, xscr1->i2,
@@ -449,12 +458,11 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1, const char *name1,
                        chg0 = xscr1->i1 + xscr1->chg1 - i0;
                        chg1 = xscr1->i2 + xscr1->chg2 - i1;
                        chg2 = xscr2->i2 + xscr2->chg2 - i2;
-                       if (ffo > 0)
-                               chg2 += ffo;
-                       else {
+                       if (ffo < 0) {
                                chg0 -= ffo;
                                chg1 -= ffo;
-                       }
+                       } else
+                               chg2 += ffo;
                        if (xdl_append_merge(&c, 0,
                                             i0, chg0, i1, chg1, i2, chg2)) {
                                xdl_cleanup_merge(changes);
@@ -505,9 +513,10 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1, const char *name1,
        if (!changes)
                changes = c;
        /* refine conflicts */
-       if (level > 1 &&
+       if (XDL_MERGE_ZEALOUS <= level &&
            (xdl_refine_conflicts(xe1, xe2, changes, xpp) < 0 ||
-            xdl_simplify_non_conflicts(xe1, changes, level > 2) < 0)) {
+            xdl_simplify_non_conflicts(xe1, changes,
+                                       XDL_MERGE_ZEALOUS < level) < 0)) {
                xdl_cleanup_merge(changes);
                return -1;
        }
@@ -554,23 +563,22 @@ int xdl_merge(mmfile_t *orig, mmfile_t *mf1, const char *name1,
                return -1;
        }
        status = 0;
-       if (xscr1 || xscr2) {
-               if (!xscr1) {
-                       result->ptr = xdl_malloc(mf2->size);
-                       memcpy(result->ptr, mf2->ptr, mf2->size);
-                       result->size = mf2->size;
-               } else if (!xscr2) {
-                       result->ptr = xdl_malloc(mf1->size);
-                       memcpy(result->ptr, mf1->ptr, mf1->size);
-                       result->size = mf1->size;
-               } else {
-                       status = xdl_do_merge(&xe1, xscr1, name1,
-                                             &xe2, xscr2, name2,
-                                             flags, xpp, result);
-               }
-               xdl_free_script(xscr1);
-               xdl_free_script(xscr2);
+       if (!xscr1) {
+               result->ptr = xdl_malloc(mf2->size);
+               memcpy(result->ptr, mf2->ptr, mf2->size);
+               result->size = mf2->size;
+       } else if (!xscr2) {
+               result->ptr = xdl_malloc(mf1->size);
+               memcpy(result->ptr, mf1->ptr, mf1->size);
+               result->size = mf1->size;
+       } else {
+               status = xdl_do_merge(&xe1, xscr1, name1,
+                                     &xe2, xscr2, name2,
+                                     flags, xpp, result);
        }
+       xdl_free_script(xscr1);
+       xdl_free_script(xscr2);
+
        xdl_free_env(&xe1);
        xdl_free_env(&xe2);