diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py +++ b/mercurial/revlogutils/deltas.py @@ -932,6 +932,21 @@ class deltacomputer(object): def _builddeltainfo(self, revinfo, base, fh): # can we use the cached delta? + revlog = self.revlog + chainbase = revlog.chainbase(base) + if revlog._generaldelta: + deltabase = base + else: + deltabase = chainbase + snapshotdepth = None + if revlog._sparserevlog and deltabase == nullrev: + snapshotdepth = 0 + elif revlog._sparserevlog and revlog.issnapshot(deltabase): + # A delta chain should always be one full snapshot, + # zero or more semi-snapshots, and zero or more deltas + p1, p2 = revlog.rev(revinfo.p1), revlog.rev(revinfo.p2) + if deltabase not in (p1, p2) and revlog.issnapshot(deltabase): + snapshotdepth = len(revlog._deltachain(deltabase)[0]) delta = None if revinfo.cachedelta: cachebase, cachediff = revinfo.cachedelta @@ -945,31 +960,14 @@ class deltacomputer(object): delta = revinfo.cachedelta[1] if delta is None: delta = self._builddeltadiff(base, revinfo, fh) - revlog = self.revlog header, data = revlog.compress(delta) deltalen = len(header) + len(data) - chainbase = revlog.chainbase(base) offset = revlog.end(len(revlog) - 1) dist = deltalen + offset - revlog.start(chainbase) - if revlog._generaldelta: - deltabase = base - else: - deltabase = chainbase chainlen, compresseddeltalen = revlog._chaininfo(base) chainlen += 1 compresseddeltalen += deltalen - revlog = self.revlog - snapshotdepth = None - if deltabase == nullrev: - snapshotdepth = 0 - elif revlog._sparserevlog and revlog.issnapshot(deltabase): - # A delta chain should always be one full snapshot, - # zero or more semi-snapshots, and zero or more deltas - p1, p2 = revlog.rev(revinfo.p1), revlog.rev(revinfo.p2) - if deltabase not in (p1, p2) and revlog.issnapshot(deltabase): - snapshotdepth = len(revlog._deltachain(deltabase)[0]) - return _deltainfo(dist, deltalen, (header, data), deltabase, chainbase, chainlen, compresseddeltalen, snapshotdepth)