[PATCH 01 of 10] revlog: add clone method
Gregory Szorc
gregory.szorc at gmail.com
Sun Nov 6 04:40:17 UTC 2016
# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1478405835 25200
# Sat Nov 05 21:17:15 2016 -0700
# Node ID ebbd8d975e4bf59b2bdd44736fdf13222988d1a4
# Parent f01367faa792635ad2f7a6b175ae3252292b5121
revlog: add clone method
Upcoming patches will introduce functionality for in-place
repository/store "upgrades." Copying the contents of a revlog
feels sufficiently low-level to warrant being in the revlog
class.
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1818,3 +1818,32 @@ class revlog(object):
if not self._inline:
res.append(self.datafile)
return res
+
+ def clone(self, tr, destrevlog, addrevisioncb=None):
+ """Copy the contents of this revlog to another revlog.
+
+ The destination revlog will contain the same revisions and nodes.
+ However, it may not be bit-for-bit identical due to e.g. delta encoding
+ differences.
+ """
+ if len(destrevlog):
+ raise ValueError(_('destination revlog is not empty'))
+
+ index = self.index
+ for rev in self:
+ entry = index[rev]
+
+ # Some classes override linkrev to take filtered revs into
+ # account. Use raw entry from index.
+ linkrev = entry[4]
+ p1 = index[entry[5]][7]
+ p2 = index[entry[6]][7]
+ node = entry[7]
+ # FUTURE we could optionally allow reusing the delta to avoid
+ # expensive recomputation.
+ text = self.revision(rev)
+
+ destrevlog.addrevision(text, tr, linkrev, p1, p2, node=node)
+
+ if addrevisioncb:
+ addrevisioncb(self, rev, node)
More information about the Mercurial-devel
mailing list