diff --git a/mercurial/filelog.py b/mercurial/filelog.py --- a/mercurial/filelog.py +++ b/mercurial/filelog.py @@ -20,6 +20,7 @@ from .utils import storageutil from .revlogutils import ( constants as revlog_constants, + rewrite, ) @@ -158,6 +159,9 @@ ) with self._revlog._writing(transaction): + + deltas = rewrite.filter_delta_issue6528(self._revlog, deltas) + return self._revlog.addgroup( deltas, linkmapper, diff --git a/mercurial/revlogutils/rewrite.py b/mercurial/revlogutils/rewrite.py --- a/mercurial/revlogutils/rewrite.py +++ b/mercurial/revlogutils/rewrite.py @@ -29,6 +29,7 @@ ENTRY_SIDEDATA_COMPRESSED_LENGTH, ENTRY_SIDEDATA_COMPRESSION_MODE, ENTRY_SIDEDATA_OFFSET, + REVIDX_ISCENSORED, REVLOGV0, REVLOGV1, ) @@ -36,6 +37,7 @@ from .. import ( error, + mdiff, pycompat, revlogutils, util, @@ -719,6 +721,88 @@ _reorder_filelog_parents(repo, fl, sorted(to_fix)) +def filter_delta_issue6528(revlog, deltas_iter): + """filter incomind deltas to repaire issue 6528 on the fly""" + metadata_cache = {} + + deltacomputer = deltas.deltacomputer(revlog) + + for rev, d in enumerate(deltas_iter, len(revlog)): + ( + node, + p1_node, + p2_node, + linknode, + deltabase, + delta, + flags, + sidedata, + ) = d + + if not revlog.index.has_node(deltabase): + raise error.LookupError( + deltabase, revlog.radix, _(b'unknown parent') + ) + base_rev = revlog.rev(deltabase) + if not revlog.index.has_node(p1_node): + raise error.LookupError(p1_node, revlog.radix, _(b'unknown parent')) + p1_rev = revlog.rev(p1_node) + if not revlog.index.has_node(p2_node): + raise error.LookupError(p2_node, revlog.radix, _(b'unknown parent')) + p2_rev = revlog.rev(p2_node) + + is_censored = lambda: bool(flags & REVIDX_ISCENSORED) + delta_base = lambda: revlog.rev(delta_base) + delta_base = lambda: base_rev + parent_revs = lambda: (p1_rev, p2_rev) + + def full_text(): + # note: being able to reuse the full text computation in the + # underlying addrevision would be useful however this is a bit too + # intrusive the for the "quick" issue6528 we are writing before the + # 5.8 release + textlen = mdiff.patchedsize(revlog.size(base_rev), delta) + + revinfo = revlogutils.revisioninfo( + node, + p1_node, + p2_node, + [None], + textlen, + (base_rev, delta), + flags, + ) + # cached by the global "writing" context + assert revlog._writinghandles is not None + if revlog._inline: + fh = revlog._writinghandles[0] + else: + fh = revlog._writinghandles[1] + return deltacomputer.buildtext(revinfo, fh) + + is_affected = _is_revision_affected_fast_inner( + is_censored, + delta_base, + lambda: delta, + full_text, + parent_revs, + rev, + metadata_cache, + ) + if is_affected: + d = ( + node, + p2_node, + p1_node, + linknode, + deltabase, + delta, + flags, + sidedata, + ) + yield d + + def repair_issue6528( ui, repo, dry_run=False, to_report=None, from_report=None, paranoid=False ): diff --git a/tests/bundles/issue6528.hg-v1 b/tests/bundles/issue6528.hg-v1 new file mode 100644 index 0000000000000000000000000000000000000000..fcc34db8300a7a93729057f6440ca2a760cfabeb GIT binary patch literal 2223 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 literal 0 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