Read about our upcoming Code of Conduct on this issue

This instance was upgraded to Heptapod 0.28.0 today

Commit 48d4a3cd authored by Augie Fackler's avatar Augie Fackler
Browse files

manifest: introduce new exception to signal unavailability of fastdelta()

I've spent some time reflecting on this, and I think this is the best
we can do in this API contract for now. This opens the door to adding
treemanifest's implementation to the list of implementers of
imanifestdict.

Differential Revision: https://phab.mercurial-scm.org/D8365
parent 25d97090c6ca
......@@ -1052,6 +1052,9 @@ class imanifestdict(interfaceutil.Interface):
Returns a 2-tuple containing ``bytearray(self.text())`` and the
delta between ``base`` and this manifest.
If this manifest implementation can't support ``fastdelta()``,
raise ``mercurial.manifest.FastdeltaUnavailable``.
"""
......
......@@ -1212,6 +1212,9 @@ class treemanifest(object):
ret._dirty = True
return ret
def fastdelta(self, base, changes):
raise FastdeltaUnavailable()
def diff(self, m2, match=None, clean=False):
'''Finds changes between the current manifest and m2.
......@@ -1488,6 +1491,10 @@ class manifestfulltextcache(util.lrucachedict):
MAXCOMPRESSION = 3
class FastdeltaUnavailable(Exception):
"""Exception raised when fastdelta isn't usable on a manifest."""
@interfaceutil.implementer(repository.imanifeststorage)
class manifestrevlog(object):
'''A revlog that stores manifest texts. This is responsible for caching the
......@@ -1614,7 +1621,9 @@ class manifestrevlog(object):
readtree=None,
match=None,
):
if p1 in self.fulltextcache and util.safehasattr(m, b'fastdelta'):
try:
if p1 not in self.fulltextcache:
raise FastdeltaUnavailable()
# If our first parent is in the manifest cache, we can
# compute a delta here using properties we know about the
# manifest up-front, which may save time later for the
......@@ -1633,11 +1642,12 @@ class manifestrevlog(object):
n = self._revlog.addrevision(
text, transaction, link, p1, p2, cachedelta
)
else:
# The first parent manifest isn't already loaded, so we'll
# just encode a fulltext of the manifest and pass that
# through to the revlog layer, and let it handle the delta
# process.
except FastdeltaUnavailable:
# The first parent manifest isn't already loaded or the
# manifest implementation doesn't support fastdelta, so
# we'll just encode a fulltext of the manifest and pass
# that through to the revlog layer, and let it handle the
# delta process.
if self._treeondisk:
assert readtree, b"readtree must be set for treemanifest writes"
assert match, b"match must be specified for treemanifest writes"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment