mercurial/revlogutils/rewrite.py
changeset 51267 ceeb8fa23cc8
parent 51156 3e2a878fb96f
child 51686 493034cc3265
equal deleted inserted replaced
51266:db121ddd171e 51267:ceeb8fa23cc8
    49     constants,
    49     constants,
    50     deltas,
    50     deltas,
    51 )
    51 )
    52 
    52 
    53 
    53 
    54 def v1_censor(rl, tr, censornode, tombstone=b''):
    54 def v1_censor(rl, tr, censor_nodes, tombstone=b''):
    55     """censors a revision in a "version 1" revlog"""
    55     """censors a revision in a "version 1" revlog"""
    56     assert rl._format_version == constants.REVLOGV1, rl._format_version
    56     assert rl._format_version == constants.REVLOGV1, rl._format_version
    57 
    57 
    58     # avoid cycle
    58     # avoid cycle
    59     from .. import revlog
    59     from .. import revlog
    60 
    60 
    61     censorrev = rl.rev(censornode)
    61     censor_revs = set(rl.rev(node) for node in censor_nodes)
    62     tombstone = storageutil.packmeta({b'censored': tombstone}, b'')
    62     tombstone = storageutil.packmeta({b'censored': tombstone}, b'')
    63 
    63 
    64     # Rewriting the revlog in place is hard. Our strategy for censoring is
    64     # Rewriting the revlog in place is hard. Our strategy for censoring is
    65     # to create a new revlog, copy all revisions to it, then replace the
    65     # to create a new revlog, copy all revisions to it, then replace the
    66     # revlogs on transaction close.
    66     # revlogs on transaction close.
    85 
    85 
    86     for rev in rl.revs():
    86     for rev in rl.revs():
    87         node = rl.node(rev)
    87         node = rl.node(rev)
    88         p1, p2 = rl.parents(node)
    88         p1, p2 = rl.parents(node)
    89 
    89 
    90         if rev == censorrev:
    90         if rev in censor_revs:
    91             newrl.addrawrevision(
    91             newrl.addrawrevision(
    92                 tombstone,
    92                 tombstone,
    93                 tr,
    93                 tr,
    94                 rl.linkrev(censorrev),
    94                 rl.linkrev(rev),
    95                 p1,
    95                 p1,
    96                 p2,
    96                 p2,
    97                 censornode,
    97                 node,
    98                 constants.REVIDX_ISCENSORED,
    98                 constants.REVIDX_ISCENSORED,
    99             )
    99             )
   100 
   100 
   101             if newrl.deltaparent(rev) != nullrev:
   101             if newrl.deltaparent(rev) != nullrev:
   102                 m = _(b'censored revision stored as delta; cannot censor')
   102                 m = _(b'censored revision stored as delta; cannot censor')
   136     rl.clearcaches()
   136     rl.clearcaches()
   137     chunk_cache = rl._loadindex()
   137     chunk_cache = rl._loadindex()
   138     rl._load_inner(chunk_cache)
   138     rl._load_inner(chunk_cache)
   139 
   139 
   140 
   140 
   141 def v2_censor(revlog, tr, censornode, tombstone=b''):
   141 def v2_censor(revlog, tr, censor_nodes, tombstone=b''):
   142     """censors a revision in a "version 2" revlog"""
   142     """censors a revision in a "version 2" revlog"""
   143     assert revlog._format_version != REVLOGV0, revlog._format_version
   143     assert revlog._format_version != REVLOGV0, revlog._format_version
   144     assert revlog._format_version != REVLOGV1, revlog._format_version
   144     assert revlog._format_version != REVLOGV1, revlog._format_version
   145 
   145 
   146     censor_revs = {revlog.rev(censornode)}
   146     censor_revs = {revlog.rev(node) for node in censor_nodes}
   147     _rewrite_v2(revlog, tr, censor_revs, tombstone)
   147     _rewrite_v2(revlog, tr, censor_revs, tombstone)
   148 
   148 
   149 
   149 
   150 def _rewrite_v2(revlog, tr, censor_revs, tombstone=b''):
   150 def _rewrite_v2(revlog, tr, censor_revs, tombstone=b''):
   151     """rewrite a revlog to censor some of its content
   151     """rewrite a revlog to censor some of its content