[PATCH 05 of 12] Add revlog fork function for overlay creation

Brendan Cully brendan at kublai.com
Tue Jan 2 15:42:17 CST 2007


# HG changeset patch
# User Brendan Cully <brendan at kublai.com>
# Date 1167777086 18000
# Node ID 579c2afa76e8e3e57e01f3432d20c7536a0e70f9
# Parent  b672acbc4b80ab615d2928630d77c2ee875d3c4a
Add revlog fork function for overlay creation.

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -389,6 +389,44 @@ class revlog(object):
         self.parent = parent
         self.startrev = 0
         self.load()
+
+    def fork(self, dest_opener):
+        """
+        Create an overlay revlog at dest
+        """
+        n = self.count()
+        if not n:
+            return
+        inline = self.inlinedata()
+        b = self.base(n - 1)
+        offset = self.start(b)
+        # copy from base of tip to tip
+        if not inline:
+            ds = self.opener(self.datafile)
+            ds.seek(offset)
+            dfh = dest_opener(self.datafile, 'wb')
+            datalen = self.end(n - 1) - offset
+            dfh.write(ds.read(datalen))
+        version = self.version | REVLOGNGOVERLAY
+        ifh = dest_opener(self.indexfile, 'wb')
+        if inline:
+            isz = struct.calcsize(self.indexformat)
+            idata = self.opener(self.indexfile)
+            idata.seek(offset + (b + 1) * isz)
+        if self.version != REVLOGV0:
+            offset = self.offset_type(offset, 0)
+        for i in xrange(b, n):
+            e = list(self.index[i])
+            e[0] -= offset
+            idx = struct.pack(self.indexformat, *e)
+            if i == b:
+                l = struct.pack(versionformat, version)
+                idx = l + idx[4:]
+            ifh.write(idx)
+            if inline:
+                ifh.write(idata.read(self.length(i)))
+                idata.read(isz)
+        ifh.close()
 
     def load(self):
         v = self.defversion


More information about the Mercurial-devel mailing list