censor: split the core of the logic into its own function
We now have a "generic" rewrite function (only able to do censoring for now)
and a thin wrapper that implement the `censor` API with it.
We are now ready to start incorporating strip specific changes.
Differential Revision: https://phab.mercurial-scm.org/D10904
--- a/mercurial/revlogutils/rewrite.py Tue Jun 22 23:20:32 2021 +0200
+++ b/mercurial/revlogutils/rewrite.py Tue Jun 22 22:52:08 2021 +0200
@@ -127,26 +127,35 @@
def v2_censor(revlog, tr, censornode, tombstone=b''):
"""censors a revision in a "version 2" revlog"""
- # General principle
- #
- # We create new revlog files (index/data/sidedata) to copy the content of
- # the existing data without the censored data.
- #
- # We need to recompute new delta for any revision that used the censored
- # revision as delta base. As the cumulative size of the new delta may be
- # large, we store them in a temporary file until they are stored in their
- # final destination.
- #
- # All data before the censored data can be blindly copied. The rest needs
- # to be copied as we go and the associated index entry needs adjustement.
+ assert revlog._format_version != REVLOGV0, revlog._format_version
+ assert revlog._format_version != REVLOGV1, revlog._format_version
+
+ censor_revs = {revlog.rev(censornode)}
+ _rewrite_v2(revlog, tr, censor_revs, tombstone)
+
+
+def _rewrite_v2(revlog, tr, censor_revs, tombstone=b''):
+ """rewrite a revlog to censor some of its content
+
+ General principle
+ We create new revlog files (index/data/sidedata) to copy the content of
+ the existing data without the censored data.
+
+ We need to recompute new delta for any revision that used the censored
+ revision as delta base. As the cumulative size of the new delta may be
+ large, we store them in a temporary file until they are stored in their
+ final destination.
+
+ All data before the censored data can be blindly copied. The rest needs
+ to be copied as we go and the associated index entry needs adjustement.
+ """
assert revlog._format_version != REVLOGV0, revlog._format_version
assert revlog._format_version != REVLOGV1, revlog._format_version
old_index = revlog.index
docket = revlog._docket
- censor_revs = {revlog.rev(censornode)}
tombstone = storageutil.packmeta({b'censored': tombstone}, b'')
first_excl_rev = min(censor_revs)