mercurial/merge.py
changeset 6518 92ccccb55ba3
parent 6517 fcfb6a0a0a84
child 6530 4b92591c69a7
--- a/mercurial/merge.py	Fri Apr 11 12:04:26 2008 +0200
+++ b/mercurial/merge.py	Fri Apr 11 12:52:56 2008 -0500
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
-from node import nullid, nullrev, hex
+from node import nullid, nullrev, hex, bin
 from i18n import _
 import errno, util, os, filemerge, copies, shutil
 
@@ -13,27 +13,49 @@
     '''track 3-way merge state of individual files'''
     def __init__(self, repo):
         self._repo = repo
+        self._read()
+    def reset(self, node):
         self._state = {}
-        self._data = {}
-    def reset(self, node):
         self._local = node
         shutil.rmtree(self._repo.join("merge"), True)
+    def _read(self):
+        self._state = {}
+        try:
+            f = self._repo.opener("merge/state")
+            self._local = bin(f.readline()[:-1])
+            for l in f:
+                bits = l[:-1].split("\0")
+                self._state[bits[0]] = bits[1:]
+        except IOError, err:
+            if err.errno != errno.ENOENT:
+                raise
+    def _write(self):
+        f = self._repo.opener("merge/state", "w")
+        f.write(hex(self._local) + "\n")
+        for d, v in self._state.items():
+            f.write("\0".join([d] + v) + "\n")
     def add(self, fcl, fco, fca, fd, flags):
         hash = util.sha1(fcl.path()).hexdigest()
         self._repo.opener("merge/" + hash, "w").write(fcl.data())
-        self._state[fd] = 'u'
-        self._data[fd] = (hash, fcl.path(), fca.path(), hex(fca.filenode()),
-                          fco.path(), flags)
+        self._state[fd] = ['u', hash, fcl.path(), fca.path(),
+                           hex(fca.filenode()), fco.path(), flags]
+        self._write()
     def __contains__(self, dfile):
         return dfile in self._state
     def __getitem__(self, dfile):
-        return self._state[dfile]
+        return self._state[dfile][0]
+    def __iter__(self):
+        l = self._state.keys()
+        l.sort()
+        for f in l:
+            yield f
     def mark(self, dfile, state):
-        self._state[dfile] = state
+        self._state[dfile][0] = state
+        self._write()
     def resolve(self, dfile, wctx, octx):
         if self[dfile] == 'r':
             return 0
-        hash, lfile, afile, anode, ofile, flags = self._data[dfile]
+        state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
         f = self._repo.opener("merge/" + hash)
         self._repo.wwrite(dfile, f.read(), flags)
         fcd = wctx[dfile]
@@ -41,7 +63,6 @@
         fca = self._repo.filectx(afile, fileid=anode)
         r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
         if not r:
-            util.set_flags(self._repo.wjoin(dfile), flags)
             self.mark(dfile, 'r')
         return r