changeset 27048:86290f6f6599

mergestate._resolve: handle change/delete conflicts We will represent a deleted file as 'nullhex' in the in-memory and on-disk merge states. We need to be able to create absentfilectxes in that case, and delete the file from disk rather than try to write it out.
author Siddharth Agarwal <sid0@fb.com>
date Fri, 20 Nov 2015 01:14:15 -0800
parents e1458049dca5
children 0d61f7ec7f76
files mercurial/merge.py
diffstat 1 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/merge.py	Sat Nov 14 00:00:46 2015 -0800
+++ b/mercurial/merge.py	Fri Nov 20 01:14:15 2015 -0800
@@ -414,8 +414,9 @@
         stateentry = self._state[dfile]
         state, hash, lfile, afile, anode, ofile, onode, flags = stateentry
         octx = self._repo[self._other]
-        fcd = wctx[dfile]
-        fco = octx[ofile]
+        fcd = self._filectxorabsent(hash, wctx, dfile)
+        fco = self._filectxorabsent(onode, octx, ofile)
+        # TODO: move this to filectxorabsent
         fca = self._repo.filectx(afile, fileid=anode)
         # "premerge" x flags
         flo = fco.flags()
@@ -429,9 +430,12 @@
                 flags = flo
         if preresolve:
             # restore local
-            f = self._repo.vfs('merge/' + hash)
-            self._repo.wwrite(dfile, f.read(), flags)
-            f.close()
+            if hash != nullhex:
+                f = self._repo.vfs('merge/' + hash)
+                self._repo.wwrite(dfile, f.read(), flags)
+                f.close()
+            else:
+                self._repo.wvfs.unlinkpath(dfile, ignoremissing=True)
             complete, r, deleted = filemerge.premerge(self._repo, self._local,
                                                       lfile, fcd, fco, fca,
                                                       labels=labels)
@@ -462,6 +466,12 @@
 
         return complete, r, action
 
+    def _filectxorabsent(self, hexnode, ctx, f):
+        if hexnode == nullhex:
+            return filemerge.absentfilectx(ctx, f)
+        else:
+            return ctx[f]
+
     def preresolve(self, dfile, wctx, labels=None):
         """run premerge process for dfile