[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