[PATCH 5 of 5 mergedriver V2] merge.mergestate: compute dirstate action

Siddharth Agarwal sid0 at fb.com
Thu Nov 19 12:53:08 CST 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1447959002 28800
#      Thu Nov 19 10:50:02 2015 -0800
# Node ID 0ce719f9080e9dccb02929b675a14f1b36bf74f4
# Parent  5ac34a97b978556e38e2e264ecefb7e903e98c16
# Available At http://42.netv6.net/sid0-wip/hg/
#              hg pull http://42.netv6.net/sid0-wip/hg/ -r 0ce719f9080e
merge.mergestate: compute dirstate action

In upcoming patches we're going to queue these actions up to be applied to the
dirstate at the end.

diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -410,7 +410,7 @@ class mergestate(object):
     def _resolve(self, preresolve, dfile, wctx, labels=None):
         """rerun merge process for file path `dfile`"""
         if self[dfile] in 'rd':
-            return True, 0
+            return True, 0, None
         stateentry = self._state[dfile]
         state, hash, lfile, afile, anode, ofile, onode, flags = stateentry
         octx = self._repo[self._other]
@@ -445,19 +445,35 @@ class mergestate(object):
             self._dirty = True
         elif not r:
             self.mark(dfile, 'r')
-        return complete, r
+
+        action = None
+        if complete:
+            if deleted:
+                if not fcd.isabsent(): # cd: remote picked (or otherwise deleted)
+                    action = 'r'
+                # else: dc: local picked (no action necessary)
+            else:
+                if fcd.isabsent(): # dc: remote picked
+                    action = 'g'
+                elif fco.isabsent(): # cd: local picked
+                    action = 'a'
+                # else: regular merges (no action necessary)
+
+        return complete, r, action
 
     def preresolve(self, dfile, wctx, labels=None):
         """run premerge process for dfile
 
         Returns whether the merge is complete, and the exit code."""
-        return self._resolve(True, dfile, wctx, labels=labels)
+        complete, r, action = self._resolve(True, dfile, wctx, labels=labels)
+        return complete, r
 
     def resolve(self, dfile, wctx, labels=None):
         """run merge process (assuming premerge was run) for dfile
 
         Returns the exit code of the merge."""
-        return self._resolve(False, dfile, wctx, labels=labels)[1]
+        complete, r, action = self._resolve(False, dfile, wctx, labels=labels)
+        return r
 
 def _checkunknownfile(repo, wctx, mctx, f, f2=None):
     if f2 is None:


More information about the Mercurial-devel mailing list