# HG changeset patch # User Siddharth Agarwal # Date 1448010855 28800 # Node ID 86290f6f65993e01f2871fe52ee7d4433ed857a4 # Parent e1458049dca5e7f9bc3997f8b4eec3a9fbfe0731 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. diff -r e1458049dca5 -r 86290f6f6599 mercurial/merge.py --- 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