[PATCH 5 of 6 mergedriver] merge: introduce a preresolve function

Siddharth Agarwal sid0 at fb.com
Mon Oct 12 15:09:41 CDT 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1444619532 25200
#      Sun Oct 11 20:12:12 2015 -0700
# Node ID d16d6cbc3155462397dd78398f488307a4bc1545
# Parent  f7af6a6a06e73338b8a2536035a40e8303a5175f
merge: introduce a preresolve function

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5589,7 +5589,10 @@ def resolve(ui, repo, *pats, **opts):
                     # resolve file
                     ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
                                  'resolve')
-                    if ms.resolve(f, wctx):
+                    complete, r = ms.preresolve(f, wctx)
+                    if not complete:
+                        r = ms.resolve(f, wctx)
+                    if r:
                         ret = 1
                 finally:
                     ui.setconfig('ui', 'forcemerge', '', 'resolve')
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -287,7 +287,7 @@ class mergestate(object):
             if entry[0] == 'u':
                 yield f
 
-    def _resolve(self, dfile, wctx, labels=None):
+    def _resolve(self, preresolve, dfile, wctx, labels=None):
         """rerun merge process for file path `dfile`"""
         if self[dfile] == 'r':
             return True, 0
@@ -302,17 +302,19 @@ class mergestate(object):
         fla = fca.flags()
         if 'x' in flags + flo + fla and 'l' not in flags + flo + fla:
             if fca.node() == nullid:
-                self._repo.ui.warn(_('warning: cannot merge flags for %s\n') %
-                                   afile)
+                if preresolve:
+                    self._repo.ui.warn(
+                        _('warning: cannot merge flags for %s\n') % afile)
             elif flags == fla:
                 flags = flo
-        # restore local
-        f = self._repo.vfs('merge/' + hash)
-        self._repo.wwrite(dfile, f.read(), flags)
-        f.close()
-        complete, r = filemerge.premerge(self._repo, self._local, lfile, fcd,
-                                         fco, fca, labels=labels)
-        if not complete:
+        if preresolve:
+            # restore local
+            f = self._repo.vfs('merge/' + hash)
+            self._repo.wwrite(dfile, f.read(), flags)
+            f.close()
+            complete, r = filemerge.premerge(self._repo, self._local, lfile,
+                                             fcd, fco, fca, labels=labels)
+        else:
             complete, r = filemerge.filemerge(self._repo, self._local, lfile,
                                               fcd, fco, fca, labels=labels)
         if r is None:
@@ -323,6 +325,9 @@ class mergestate(object):
             self.mark(dfile, 'r')
         return complete, r
 
+    def preresolve(self, dfile, wctx, labels=None):
+        return self._resolve(True, dfile, wctx, labels=labels)
+
     def resolve(self, dfile, wctx, labels=None):
         """rerun merge process for file path `dfile`"""
         return self._resolve(False, dfile, wctx, labels=labels)[1]
@@ -855,7 +860,9 @@ def applyupdates(repo, actions, wctx, mc
                              overwrite)
             continue
         audit(f)
-        r = ms.resolve(f, wctx, labels=labels)
+        complete, r = ms.preresolve(f, wctx, labels=labels)
+        if not complete:
+            r = ms.resolve(f, wctx, labels=labels)
         if r is not None and r > 0:
             unresolved += 1
         else:


More information about the Mercurial-devel mailing list