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 |