diff mercurial/changelog.py @ 7787:b8d750daadde

Introduce HG_PREPEND to solve pretxn races - add writepending to flush delayed writes to separate file - add support in hooks for lazy evaluation of callable parameters - add HG_PENDING to pretxn hooks - call writepending if hook is used - pass repo root to hook environment - if HG_PENDING = repo root, we're in pretxn hook - read pending data to make pending changesets visible - filter HG_PENDING in tests/printenv.py
author Matt Mackall <mpm@selenic.com>
date Mon, 16 Feb 2009 19:35:07 -0600
parents 14a4337a9b9b
children bd8f44638847
line wrap: on
line diff
--- a/mercurial/changelog.py	Sun Jan 18 19:59:51 2009 +0100
+++ b/mercurial/changelog.py	Mon Feb 16 19:35:07 2009 -0600
@@ -96,7 +96,7 @@
             fp = self.opener(self.indexfile, 'a')
             fp.write("".join(self._delaybuf))
             fp.close()
-            del self._delaybuf
+            self._delaybuf = []
         # split when we're done
         self.checkinlinesize(tr)
 
@@ -115,6 +115,31 @@
         # otherwise, divert to memory
         return appender(fp, self._delaybuf)
 
+    def readpending(self, file):
+        r = revlog.revlog(self.opener, file)
+        self.index = r.index
+        self.nodemap = r.nodemap
+        self._chunkcache = r._chunkcache
+
+    def writepending(self):
+        "create a file containing the unfinalized state for pretxnchangegroup"
+        if self._delaybuf:
+            # make a temporary copy of the index
+            fp1 = self._realopener(self.indexfile)
+            fp2 = self._realopener(self.indexfile + ".a", "w")
+            fp2.write(fp1.read())
+            # add pending data
+            fp2.write("".join(self._delaybuf))
+            fp2.close()
+            # switch modes so finalize can simply rename
+            self._delaybuf = []
+            self._delayname = fp1.name
+
+        if self._delayname:
+            return True
+
+        return False
+
     def checkinlinesize(self, tr, fp=None):
         if self.opener == self._delayopener:
             return