Mercurial > hg-stable
annotate mercurial/revlogutils/rewrite.py @ 47470:bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
The logic we use for censoring revision will be mostly common with the one we
needs for stripping. So we rename the module to `rewrite` to better match its
future content.
Differential Revision: https://phab.mercurial-scm.org/D10896
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 22 Jun 2021 11:09:25 +0200 |
parents | mercurial/revlogutils/censor.py@f8330a3fc39f |
children | f7a94e2d4470 |
rev | line source |
---|---|
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
1 # censor code related to censoring revision |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
2 # coding: utf8 |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
4 # Copyright 2021 Pierre-Yves David <pierre-yves.david@octobus.net> |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
5 # Copyright 2015 Google, Inc <martinvonz@google.com> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
9 |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
10 import contextlib |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
11 import os |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
12 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
13 from ..node import ( |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
14 nullrev, |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
15 ) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
16 from .constants import ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
17 COMP_MODE_PLAIN, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
18 ENTRY_DATA_COMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
19 ENTRY_DATA_COMPRESSION_MODE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
20 ENTRY_DATA_OFFSET, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
21 ENTRY_DATA_UNCOMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
22 ENTRY_DELTA_BASE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
23 ENTRY_LINK_REV, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
24 ENTRY_NODE_ID, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
25 ENTRY_PARENT_1, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
26 ENTRY_PARENT_2, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
27 ENTRY_SIDEDATA_COMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
28 ENTRY_SIDEDATA_COMPRESSION_MODE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
29 ENTRY_SIDEDATA_OFFSET, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
30 REVLOGV0, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
31 REVLOGV1, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
32 ) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
33 from ..i18n import _ |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
34 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
35 from .. import ( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
36 error, |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
37 pycompat, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
38 revlogutils, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
39 util, |
46310
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
40 ) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
41 from ..utils import ( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
42 storageutil, |
47392
0d0fb091c49f
revlog: simplify "partial read" error message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47391
diff
changeset
|
43 ) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
44 from . import ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
45 constants, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
46 deltas, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
47 ) |
47257
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
48 |
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
49 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
50 def v1_censor(rl, tr, censornode, tombstone=b''): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
51 """censors a revision in a "version 1" revlog""" |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
52 assert rl._format_version == constants.REVLOGV1, rl._format_version |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
53 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
54 # avoid cycle |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
55 from .. import revlog |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
56 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
57 censorrev = rl.rev(censornode) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
58 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30014
diff
changeset
|
59 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
60 # Rewriting the revlog in place is hard. Our strategy for censoring is |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
61 # to create a new revlog, copy all revisions to it, then replace the |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
62 # revlogs on transaction close. |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
63 # |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
64 # This is a bit dangerous. We could easily have a mismatch of state. |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
65 newrl = revlog.revlog( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
66 rl.opener, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
67 target=rl.target, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
68 radix=rl.radix, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
69 postfix=b'tmpcensored', |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
70 censorable=True, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
71 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
72 newrl._format_version = rl._format_version |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
73 newrl._format_flags = rl._format_flags |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
74 newrl._generaldelta = rl._generaldelta |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
75 newrl._parse_index = rl._parse_index |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
76 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
77 for rev in rl.revs(): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
78 node = rl.node(rev) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
79 p1, p2 = rl.parents(node) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
80 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
81 if rev == censorrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
82 newrl.addrawrevision( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
83 tombstone, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
84 tr, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
85 rl.linkrev(censorrev), |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
86 p1, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
87 p2, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
88 censornode, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
89 constants.REVIDX_ISCENSORED, |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
90 ) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
91 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
92 if newrl.deltaparent(rev) != nullrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
93 m = _(b'censored revision stored as delta; cannot censor') |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
94 h = _( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
95 b'censoring of revlogs is not fully implemented;' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
96 b' please report this bug' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
97 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
98 raise error.Abort(m, hint=h) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
99 continue |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
100 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
101 if rl.iscensored(rev): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
102 if rl.deltaparent(rev) != nullrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
103 m = _( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
104 b'cannot censor due to censored ' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
105 b'revision having delta stored' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
106 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
107 raise error.Abort(m) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
108 rawtext = rl._chunk(rev) |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
109 else: |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
110 rawtext = rl.rawdata(rev) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
111 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
112 newrl.addrawrevision( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
113 rawtext, tr, rl.linkrev(rev), p1, p2, node, rl.flags(rev) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
114 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
115 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
116 tr.addbackup(rl._indexfile, location=b'store') |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
117 if not rl._inline: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
118 tr.addbackup(rl._datafile, location=b'store') |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
119 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
120 rl.opener.rename(newrl._indexfile, rl._indexfile) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
121 if not rl._inline: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
122 rl.opener.rename(newrl._datafile, rl._datafile) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
123 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
124 rl.clearcaches() |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
125 rl._loadindex() |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
126 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
127 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
128 def v2_censor(rl, tr, censornode, tombstone=b''): |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
129 """censors a revision in a "version 2" revlog""" |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
130 # General principle |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
131 # |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
132 # We create new revlog files (index/data/sidedata) to copy the content of |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
133 # the existing data without the censored data. |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
134 # |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
135 # We need to recompute new delta for any revision that used the censored |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
136 # revision as delta base. As the cumulative size of the new delta may be |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
137 # large, we store them in a temporary file until they are stored in their |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
138 # final destination. |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
139 # |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
140 # All data before the censored data can be blindly copied. The rest needs |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
141 # to be copied as we go and the associated index entry needs adjustement. |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
142 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
143 assert rl._format_version != REVLOGV0, rl._format_version |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
144 assert rl._format_version != REVLOGV1, rl._format_version |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
145 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
146 old_index = rl.index |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
147 docket = rl._docket |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
148 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
149 censor_rev = rl.rev(censornode) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
150 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
151 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
152 censored_entry = rl.index[censor_rev] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
153 index_cutoff = rl.index.entry_size * censor_rev |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
154 data_cutoff = censored_entry[ENTRY_DATA_OFFSET] >> 16 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
155 sidedata_cutoff = rl.sidedata_cut_off(censor_rev) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
156 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
157 # rev → (new_base, data_start, data_end) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
158 rewritten_entries = {} |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
159 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
160 dc = deltas.deltacomputer(rl) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
161 excl = [censor_rev] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
162 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
163 with pycompat.unnamedtempfile(mode=b"w+b") as tmp_storage: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
164 with rl._segmentfile._open_read() as dfh: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
165 for rev in range(censor_rev + 1, len(old_index)): |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
166 entry = old_index[rev] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
167 if censor_rev != entry[ENTRY_DELTA_BASE]: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
168 continue |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
169 # This is a revision that use the censored revision as the base |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
170 # for its delta. We need a need new deltas |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
171 if entry[ENTRY_DATA_UNCOMPRESSED_LENGTH] == 0: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
172 # this revision is empty, we can delta against nullrev |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
173 rewritten_entries[rev] = (nullrev, 0, 0) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
174 else: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
175 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
176 text = rl.rawdata(rev, _df=dfh) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
177 info = revlogutils.revisioninfo( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
178 node=entry[ENTRY_NODE_ID], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
179 p1=rl.node(entry[ENTRY_PARENT_1]), |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
180 p2=rl.node(entry[ENTRY_PARENT_2]), |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
181 btext=[text], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
182 textlen=len(text), |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
183 cachedelta=None, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
184 flags=entry[ENTRY_DATA_OFFSET] & 0xFFFF, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
185 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
186 d = dc.finddeltainfo( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
187 info, dfh, excluded_bases=excl, target_rev=rev |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
188 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
189 default_comp = rl._docket.default_compression_header |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
190 comp_mode, d = deltas.delta_compression(default_comp, d) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
191 # using `tell` is a bit lazy, but we are not here for speed |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
192 start = tmp_storage.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
193 tmp_storage.write(d.data[1]) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
194 end = tmp_storage.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
195 rewritten_entries[rev] = (d.base, start, end, comp_mode) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
196 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
197 old_index_filepath = rl.opener.join(docket.index_filepath()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
198 old_data_filepath = rl.opener.join(docket.data_filepath()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
199 old_sidedata_filepath = rl.opener.join(docket.sidedata_filepath()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
200 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
201 new_index_filepath = rl.opener.join(docket.new_index_file()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
202 new_data_filepath = rl.opener.join(docket.new_data_file()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
203 new_sidedata_filepath = rl.opener.join(docket.new_sidedata_file()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
204 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
205 util.copyfile( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
206 old_index_filepath, new_index_filepath, nb_bytes=index_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
207 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
208 util.copyfile( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
209 old_data_filepath, new_data_filepath, nb_bytes=data_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
210 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
211 util.copyfile( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
212 old_sidedata_filepath, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
213 new_sidedata_filepath, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
214 nb_bytes=sidedata_cutoff, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
215 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
216 rl.opener.register_file(docket.index_filepath()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
217 rl.opener.register_file(docket.data_filepath()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
218 rl.opener.register_file(docket.sidedata_filepath()) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
219 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
220 docket.index_end = index_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
221 docket.data_end = data_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
222 docket.sidedata_end = sidedata_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
223 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
224 # reload the revlog internal information |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
225 rl.clearcaches() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
226 rl._loadindex(docket=docket) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
227 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
228 @contextlib.contextmanager |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
229 def all_files(): |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
230 # hide opening in an helper function to please check-code, black |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
231 # and various python ersion at the same time |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
232 with open(old_data_filepath, 'rb') as old_data_file: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
233 with open(old_sidedata_filepath, 'rb') as old_sidedata_file: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
234 with open(new_index_filepath, 'r+b') as new_index_file: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
235 with open(new_data_filepath, 'r+b') as new_data_file: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
236 with open( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
237 new_sidedata_filepath, 'r+b' |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
238 ) as new_sidedata_file: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
239 yield ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
240 old_data_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
241 old_sidedata_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
242 new_index_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
243 new_data_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
244 new_sidedata_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
245 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
246 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
247 # we dont need to open the old index file since its content already |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
248 # exist in a usable form in `old_index`. |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
249 with all_files() as ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
250 old_data_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
251 old_sidedata_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
252 new_index_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
253 new_data_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
254 new_sidedata_file, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
255 ): |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
256 new_index_file.seek(0, os.SEEK_END) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
257 assert new_index_file.tell() == index_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
258 new_data_file.seek(0, os.SEEK_END) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
259 assert new_data_file.tell() == data_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
260 new_sidedata_file.seek(0, os.SEEK_END) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
261 assert new_sidedata_file.tell() == sidedata_cutoff |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
262 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
263 ### writing the censored revision |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
264 entry = old_index[censor_rev] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
265 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
266 # XXX consider trying the default compression too |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
267 new_data_size = len(tombstone) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
268 new_data_offset = new_data_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
269 new_data_file.write(tombstone) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
270 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
271 # we are not adding any sidedata as they might leak info about the censored version |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
272 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
273 new_entry = revlogutils.entry( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
274 flags=constants.REVIDX_ISCENSORED, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
275 data_offset=new_data_offset, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
276 data_compressed_length=new_data_size, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
277 data_uncompressed_length=new_data_size, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
278 data_delta_base=censor_rev, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
279 link_rev=entry[ENTRY_LINK_REV], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
280 parent_rev_1=entry[ENTRY_PARENT_1], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
281 parent_rev_2=entry[ENTRY_PARENT_2], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
282 node_id=entry[ENTRY_NODE_ID], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
283 sidedata_offset=0, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
284 sidedata_compressed_length=0, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
285 data_compression_mode=COMP_MODE_PLAIN, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
286 sidedata_compression_mode=COMP_MODE_PLAIN, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
287 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
288 rl.index.append(new_entry) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
289 entry_bin = rl.index.entry_binary(censor_rev) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
290 new_index_file.write(entry_bin) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
291 docket.index_end = new_index_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
292 docket.data_end = new_data_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
293 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
294 #### Writing all subsequent revisions |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
295 for rev in range(censor_rev + 1, len(old_index)): |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
296 entry = old_index[rev] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
297 flags = entry[ENTRY_DATA_OFFSET] & 0xFFFF |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
298 old_data_offset = entry[ENTRY_DATA_OFFSET] >> 16 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
299 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
300 if rev not in rewritten_entries: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
301 old_data_file.seek(old_data_offset) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
302 new_data_size = entry[ENTRY_DATA_COMPRESSED_LENGTH] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
303 new_data = old_data_file.read(new_data_size) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
304 data_delta_base = entry[ENTRY_DELTA_BASE] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
305 d_comp_mode = entry[ENTRY_DATA_COMPRESSION_MODE] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
306 else: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
307 ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
308 data_delta_base, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
309 start, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
310 end, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
311 d_comp_mode, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
312 ) = rewritten_entries[rev] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
313 new_data_size = end - start |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
314 tmp_storage.seek(start) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
315 new_data = tmp_storage.read(new_data_size) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
316 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
317 # It might be faster to group continuous read/write operation, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
318 # however, this is censor, an operation that is not focussed |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
319 # around stellar performance. So I have not written this |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
320 # optimisation yet. |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
321 new_data_offset = new_data_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
322 new_data_file.write(new_data) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
323 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
324 sidedata_size = entry[ENTRY_SIDEDATA_COMPRESSED_LENGTH] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
325 new_sidedata_offset = new_sidedata_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
326 if 0 < sidedata_size: |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
327 old_sidedata_offset = entry[ENTRY_SIDEDATA_OFFSET] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
328 old_sidedata_file.seek(old_sidedata_offset) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
329 new_sidedata = old_sidedata_file.read(sidedata_size) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
330 new_sidedata_file.write(new_sidedata) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
331 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
332 data_uncompressed_length = entry[ENTRY_DATA_UNCOMPRESSED_LENGTH] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
333 sd_com_mode = entry[ENTRY_SIDEDATA_COMPRESSION_MODE] |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
334 assert data_delta_base <= rev, (data_delta_base, rev) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
335 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
336 new_entry = revlogutils.entry( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
337 flags=flags, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
338 data_offset=new_data_offset, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
339 data_compressed_length=new_data_size, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
340 data_uncompressed_length=data_uncompressed_length, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
341 data_delta_base=data_delta_base, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
342 link_rev=entry[ENTRY_LINK_REV], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
343 parent_rev_1=entry[ENTRY_PARENT_1], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
344 parent_rev_2=entry[ENTRY_PARENT_2], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
345 node_id=entry[ENTRY_NODE_ID], |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
346 sidedata_offset=new_sidedata_offset, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
347 sidedata_compressed_length=sidedata_size, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
348 data_compression_mode=d_comp_mode, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
349 sidedata_compression_mode=sd_com_mode, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
350 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
351 rl.index.append(new_entry) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
352 entry_bin = rl.index.entry_binary(rev) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
353 new_index_file.write(entry_bin) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
354 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
355 docket.index_end = new_index_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
356 docket.data_end = new_data_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
357 docket.sidedata_end = new_sidedata_file.tell() |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
358 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
359 docket.write(transaction=None, stripping=True) |