Mercurial > hg
annotate mercurial/revlogutils/rewrite.py @ 51092:9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
This is a necessary step before being able to move more logic around restoring
a revision content there.
For now, we do a simple patch for the perf extension logic, when the
implementation of the inner object changes, we will likely need some evolution
of the API. However this is true of many things in the perf extension. So we
will see this later.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 19 Oct 2023 02:57:05 +0200 |
parents | df50a1592e0c |
children | 3e2a878fb96f |
rev | line source |
---|---|
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
1 # censor code related to censoring revision |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
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 # |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
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:
47389
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 |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
10 import binascii |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
11 import contextlib |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
12 import os |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
13 import struct |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
14 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
15 from ..node import ( |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
16 nullrev, |
39767
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
17 ) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
18 from .constants import ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
19 COMP_MODE_PLAIN, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
20 ENTRY_DATA_COMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
21 ENTRY_DATA_COMPRESSION_MODE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
22 ENTRY_DATA_OFFSET, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
23 ENTRY_DATA_UNCOMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
24 ENTRY_DELTA_BASE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
25 ENTRY_LINK_REV, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
26 ENTRY_NODE_ID, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
27 ENTRY_PARENT_1, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
28 ENTRY_PARENT_2, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
29 ENTRY_SIDEDATA_COMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
30 ENTRY_SIDEDATA_COMPRESSION_MODE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
31 ENTRY_SIDEDATA_OFFSET, |
47821
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
32 REVIDX_ISCENSORED, |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
33 REVLOGV0, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
34 REVLOGV1, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
35 ) |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
36 from ..i18n import _ |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
37 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
38 from .. import ( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
39 error, |
47821
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
40 mdiff, |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
41 pycompat, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
42 revlogutils, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
43 util, |
46310
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45942
diff
changeset
|
44 ) |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
45 from ..utils import ( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
46 storageutil, |
47386
0d0fb091c49f
revlog: simplify "partial read" error message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47385
diff
changeset
|
47 ) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
48 from . import ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
49 constants, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
50 deltas, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
51 ) |
47246
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
52 |
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
53 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
54 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:
47389
diff
changeset
|
55 """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:
47389
diff
changeset
|
56 assert rl._format_version == constants.REVLOGV1, rl._format_version |
47151
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
57 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
58 # avoid cycle |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
59 from .. import revlog |
47144
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
60 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
61 censorrev = rl.rev(censornode) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
62 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30012
diff
changeset
|
63 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
64 # 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:
47389
diff
changeset
|
65 # 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:
47389
diff
changeset
|
66 # revlogs on transaction close. |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
67 # |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
68 # 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:
47389
diff
changeset
|
69 newrl = revlog.revlog( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
70 rl.opener, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
71 target=rl.target, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
72 radix=rl.radix, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
73 postfix=b'tmpcensored', |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
74 censorable=True, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
75 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
76 newrl._format_version = rl._format_version |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
77 newrl._format_flags = rl._format_flags |
51046
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51029
diff
changeset
|
78 newrl.delta_config.general_delta = rl.delta_config.general_delta |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
79 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
|
80 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
81 for rev in rl.revs(): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
82 node = rl.node(rev) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
83 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
|
84 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
85 if rev == censorrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
86 newrl.addrawrevision( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
87 tombstone, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
88 tr, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
89 rl.linkrev(censorrev), |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
90 p1, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
91 p2, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
92 censornode, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
93 constants.REVIDX_ISCENSORED, |
47294
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
94 ) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
95 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
96 if newrl.deltaparent(rev) != nullrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
97 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:
47389
diff
changeset
|
98 h = _( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
99 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:
47389
diff
changeset
|
100 b' please report this bug' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
101 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
102 raise error.Abort(m, hint=h) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
103 continue |
42980
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42879
diff
changeset
|
104 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
105 if rl.iscensored(rev): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
106 if rl.deltaparent(rev) != nullrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
107 m = _( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
108 b'cannot censor due to censored ' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
109 b'revision having delta stored' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
110 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
111 raise error.Abort(m) |
51092
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
112 rawtext = rl._inner._chunk(rev) |
42879
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42876
diff
changeset
|
113 else: |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
114 rawtext = rl.rawdata(rev) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
115 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
116 newrl.addrawrevision( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
117 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
|
118 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
119 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
120 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:
47389
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:
47389
diff
changeset
|
122 tr.addbackup(rl._datafile, location=b'store') |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
123 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
124 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:
47389
diff
changeset
|
125 if not rl._inline: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
126 rl.opener.rename(newrl._datafile, rl._datafile) |
39778
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39775
diff
changeset
|
127 |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
128 rl.clearcaches() |
51087
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51048
diff
changeset
|
129 chunk_cache = rl._loadindex() |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51048
diff
changeset
|
130 rl._load_inner(chunk_cache) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
131 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
132 |
47471
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
133 def v2_censor(revlog, tr, censornode, tombstone=b''): |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
134 """censors a revision in a "version 2" revlog""" |
47473
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
135 assert revlog._format_version != REVLOGV0, revlog._format_version |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
136 assert revlog._format_version != REVLOGV1, revlog._format_version |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
137 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
138 censor_revs = {revlog.rev(censornode)} |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
139 _rewrite_v2(revlog, tr, censor_revs, tombstone) |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
140 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
141 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
142 def _rewrite_v2(revlog, tr, censor_revs, tombstone=b''): |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
143 """rewrite a revlog to censor some of its content |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
144 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
145 General principle |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
146 |
47473
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
147 We create new revlog files (index/data/sidedata) to copy the content of |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
148 the existing data without the censored data. |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
149 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
150 We need to recompute new delta for any revision that used the censored |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
151 revision as delta base. As the cumulative size of the new delta may be |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
152 large, we store them in a temporary file until they are stored in their |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
153 final destination. |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
154 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
155 All data before the censored data can be blindly copied. The rest needs |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
156 to be copied as we go and the associated index entry needs adjustement. |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
157 """ |
47471
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
158 assert revlog._format_version != REVLOGV0, revlog._format_version |
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
159 assert revlog._format_version != REVLOGV1, revlog._format_version |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
160 |
47471
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
161 old_index = revlog.index |
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
162 docket = revlog._docket |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
163 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
164 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
165 |
47472
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
166 first_excl_rev = min(censor_revs) |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
167 |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
168 first_excl_entry = revlog.index[first_excl_rev] |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
169 index_cutoff = revlog.index.entry_size * first_excl_rev |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
170 data_cutoff = first_excl_entry[ENTRY_DATA_OFFSET] >> 16 |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
171 sidedata_cutoff = revlog.sidedata_cut_off(first_excl_rev) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
172 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
173 with pycompat.unnamedtempfile(mode=b"w+b") as tmp_storage: |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
174 # rev → (new_base, data_start, data_end, compression_mode) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
175 rewritten_entries = _precompute_rewritten_delta( |
47471
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
176 revlog, |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
177 old_index, |
47472
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
178 censor_revs, |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
179 tmp_storage, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
180 ) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
181 |
47470
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
182 all_files = _setup_new_files( |
47471
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
183 revlog, |
47470
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
184 index_cutoff, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
185 data_cutoff, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
186 sidedata_cutoff, |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
187 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
188 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
189 # 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:
47392
diff
changeset
|
190 # exist in a usable form in `old_index`. |
47466
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
191 with all_files() as open_files: |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
192 ( |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
193 old_data_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
194 old_sidedata_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
195 new_index_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
196 new_data_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
197 new_sidedata_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47465
diff
changeset
|
198 ) = open_files |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
199 |
47467
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
200 # writing the censored revision |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
201 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
202 # Writing all subsequent revisions |
47472
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
203 for rev in range(first_excl_rev, len(old_index)): |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
204 if rev in censor_revs: |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
205 _rewrite_censor( |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
206 revlog, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
207 old_index, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
208 open_files, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
209 rev, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
210 tombstone, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
211 ) |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
212 else: |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
213 _rewrite_simple( |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
214 revlog, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
215 old_index, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
216 open_files, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
217 rev, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
218 rewritten_entries, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
219 tmp_storage, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
220 ) |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
221 docket.write(transaction=None, stripping=True) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
222 |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
223 |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
224 def _precompute_rewritten_delta( |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
225 revlog, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
226 old_index, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
227 excluded_revs, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
228 tmp_storage, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
229 ): |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
230 """Compute new delta for revisions whose delta is based on revision that |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
231 will not survive as is. |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
232 |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
233 Return a mapping: {rev → (new_base, data_start, data_end, compression_mode)} |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
234 """ |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
235 dc = deltas.deltacomputer(revlog) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
236 rewritten_entries = {} |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
237 first_excl_rev = min(excluded_revs) |
51020
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51019
diff
changeset
|
238 with revlog.reading(): |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
239 for rev in range(first_excl_rev, len(old_index)): |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
240 if rev in excluded_revs: |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
241 # this revision will be preserved as is, so we don't need to |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
242 # consider recomputing a delta. |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
243 continue |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
244 entry = old_index[rev] |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
245 if entry[ENTRY_DELTA_BASE] not in excluded_revs: |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
246 continue |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
247 # This is a revision that use the censored revision as the base |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
248 # for its delta. We need a need new deltas |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
249 if entry[ENTRY_DATA_UNCOMPRESSED_LENGTH] == 0: |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
250 # this revision is empty, we can delta against nullrev |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
251 rewritten_entries[rev] = (nullrev, 0, 0, COMP_MODE_PLAIN) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
252 else: |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
253 |
51019
66c139d33cfe
censors: simply use `revlog.reading` to keep things open dring rewrite
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50504
diff
changeset
|
254 text = revlog.rawdata(rev) |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
255 info = revlogutils.revisioninfo( |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
256 node=entry[ENTRY_NODE_ID], |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
257 p1=revlog.node(entry[ENTRY_PARENT_1]), |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
258 p2=revlog.node(entry[ENTRY_PARENT_2]), |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
259 btext=[text], |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
260 textlen=len(text), |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
261 cachedelta=None, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
262 flags=entry[ENTRY_DATA_OFFSET] & 0xFFFF, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
263 ) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
264 d = dc.finddeltainfo( |
51020
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51019
diff
changeset
|
265 info, excluded_bases=excluded_revs, target_rev=rev |
47469
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
266 ) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
267 default_comp = revlog._docket.default_compression_header |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
268 comp_mode, d = deltas.delta_compression(default_comp, d) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
269 # using `tell` is a bit lazy, but we are not here for speed |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
270 start = tmp_storage.tell() |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
271 tmp_storage.write(d.data[1]) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
272 end = tmp_storage.tell() |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
273 rewritten_entries[rev] = (d.base, start, end, comp_mode) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
274 return rewritten_entries |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
275 |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47468
diff
changeset
|
276 |
47470
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
277 def _setup_new_files( |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
278 revlog, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
279 index_cutoff, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
280 data_cutoff, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
281 sidedata_cutoff, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
282 ): |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
283 """ |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
284 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
285 return a context manager to open all the relevant files: |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
286 - old_data_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
287 - old_sidedata_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
288 - new_index_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
289 - new_data_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
290 - new_sidedata_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
291 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
292 The old_index_file is not here because it is accessed through the |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
293 `old_index` object if the caller function. |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
294 """ |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
295 docket = revlog._docket |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
296 old_index_filepath = revlog.opener.join(docket.index_filepath()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
297 old_data_filepath = revlog.opener.join(docket.data_filepath()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
298 old_sidedata_filepath = revlog.opener.join(docket.sidedata_filepath()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
299 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
300 new_index_filepath = revlog.opener.join(docket.new_index_file()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
301 new_data_filepath = revlog.opener.join(docket.new_data_file()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
302 new_sidedata_filepath = revlog.opener.join(docket.new_sidedata_file()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
303 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
304 util.copyfile(old_index_filepath, new_index_filepath, nb_bytes=index_cutoff) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
305 util.copyfile(old_data_filepath, new_data_filepath, nb_bytes=data_cutoff) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
306 util.copyfile( |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
307 old_sidedata_filepath, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
308 new_sidedata_filepath, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
309 nb_bytes=sidedata_cutoff, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
310 ) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
311 revlog.opener.register_file(docket.index_filepath()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
312 revlog.opener.register_file(docket.data_filepath()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
313 revlog.opener.register_file(docket.sidedata_filepath()) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
314 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
315 docket.index_end = index_cutoff |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
316 docket.data_end = data_cutoff |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
317 docket.sidedata_end = sidedata_cutoff |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
318 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
319 # reload the revlog internal information |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
320 revlog.clearcaches() |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
321 revlog._loadindex(docket=docket) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
322 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
323 @contextlib.contextmanager |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
324 def all_files_opener(): |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
325 # hide opening in an helper function to please check-code, black |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
326 # and various python version at the same time |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
327 with open(old_data_filepath, 'rb') as old_data_file: |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
328 with open(old_sidedata_filepath, 'rb') as old_sidedata_file: |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
329 with open(new_index_filepath, 'r+b') as new_index_file: |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
330 with open(new_data_filepath, 'r+b') as new_data_file: |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
331 with open( |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
332 new_sidedata_filepath, 'r+b' |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
333 ) as new_sidedata_file: |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
334 new_index_file.seek(0, os.SEEK_END) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
335 assert new_index_file.tell() == index_cutoff |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
336 new_data_file.seek(0, os.SEEK_END) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
337 assert new_data_file.tell() == data_cutoff |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
338 new_sidedata_file.seek(0, os.SEEK_END) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
339 assert new_sidedata_file.tell() == sidedata_cutoff |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
340 yield ( |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
341 old_data_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
342 old_sidedata_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
343 new_index_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
344 new_data_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
345 new_sidedata_file, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
346 ) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
347 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
348 return all_files_opener |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
349 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
350 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
351 def _rewrite_simple( |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
352 revlog, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
353 old_index, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
354 all_files, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
355 rev, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
356 rewritten_entries, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
357 tmp_storage, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
358 ): |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
359 """append a normal revision to the index after the rewritten one(s)""" |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
360 ( |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
361 old_data_file, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
362 old_sidedata_file, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
363 new_index_file, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
364 new_data_file, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
365 new_sidedata_file, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
366 ) = all_files |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
367 entry = old_index[rev] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
368 flags = entry[ENTRY_DATA_OFFSET] & 0xFFFF |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
369 old_data_offset = entry[ENTRY_DATA_OFFSET] >> 16 |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
370 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
371 if rev not in rewritten_entries: |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
372 old_data_file.seek(old_data_offset) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
373 new_data_size = entry[ENTRY_DATA_COMPRESSED_LENGTH] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
374 new_data = old_data_file.read(new_data_size) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
375 data_delta_base = entry[ENTRY_DELTA_BASE] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
376 d_comp_mode = entry[ENTRY_DATA_COMPRESSION_MODE] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
377 else: |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
378 ( |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
379 data_delta_base, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
380 start, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
381 end, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
382 d_comp_mode, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
383 ) = rewritten_entries[rev] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
384 new_data_size = end - start |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
385 tmp_storage.seek(start) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
386 new_data = tmp_storage.read(new_data_size) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
387 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
388 # It might be faster to group continuous read/write operation, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
389 # however, this is censor, an operation that is not focussed |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
390 # around stellar performance. So I have not written this |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
391 # optimisation yet. |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
392 new_data_offset = new_data_file.tell() |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
393 new_data_file.write(new_data) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
394 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
395 sidedata_size = entry[ENTRY_SIDEDATA_COMPRESSED_LENGTH] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
396 new_sidedata_offset = new_sidedata_file.tell() |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
397 if 0 < sidedata_size: |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
398 old_sidedata_offset = entry[ENTRY_SIDEDATA_OFFSET] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
399 old_sidedata_file.seek(old_sidedata_offset) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
400 new_sidedata = old_sidedata_file.read(sidedata_size) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
401 new_sidedata_file.write(new_sidedata) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
402 |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
403 data_uncompressed_length = entry[ENTRY_DATA_UNCOMPRESSED_LENGTH] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
404 sd_com_mode = entry[ENTRY_SIDEDATA_COMPRESSION_MODE] |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
405 assert data_delta_base <= rev, (data_delta_base, rev) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
406 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
407 new_entry = revlogutils.entry( |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
408 flags=flags, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
409 data_offset=new_data_offset, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
410 data_compressed_length=new_data_size, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
411 data_uncompressed_length=data_uncompressed_length, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
412 data_delta_base=data_delta_base, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
413 link_rev=entry[ENTRY_LINK_REV], |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
414 parent_rev_1=entry[ENTRY_PARENT_1], |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
415 parent_rev_2=entry[ENTRY_PARENT_2], |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
416 node_id=entry[ENTRY_NODE_ID], |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
417 sidedata_offset=new_sidedata_offset, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
418 sidedata_compressed_length=sidedata_size, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
419 data_compression_mode=d_comp_mode, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
420 sidedata_compression_mode=sd_com_mode, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
421 ) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
422 revlog.index.append(new_entry) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
423 entry_bin = revlog.index.entry_binary(rev) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
424 new_index_file.write(entry_bin) |
47457
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47392
diff
changeset
|
425 |
47468
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
426 revlog._docket.index_end = new_index_file.tell() |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
427 revlog._docket.data_end = new_data_file.tell() |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47467
diff
changeset
|
428 revlog._docket.sidedata_end = new_sidedata_file.tell() |
47467
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
429 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
430 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
431 def _rewrite_censor( |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
432 revlog, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
433 old_index, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
434 all_files, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
435 rev, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
436 tombstone, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
437 ): |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
438 """rewrite and append a censored revision""" |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
439 ( |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
440 old_data_file, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
441 old_sidedata_file, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
442 new_index_file, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
443 new_data_file, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
444 new_sidedata_file, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
445 ) = all_files |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
446 entry = old_index[rev] |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
447 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
448 # XXX consider trying the default compression too |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
449 new_data_size = len(tombstone) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
450 new_data_offset = new_data_file.tell() |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
451 new_data_file.write(tombstone) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
452 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
453 # we are not adding any sidedata as they might leak info about the censored version |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
454 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
455 link_rev = entry[ENTRY_LINK_REV] |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
456 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
457 p1 = entry[ENTRY_PARENT_1] |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
458 p2 = entry[ENTRY_PARENT_2] |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
459 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
460 new_entry = revlogutils.entry( |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
461 flags=constants.REVIDX_ISCENSORED, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
462 data_offset=new_data_offset, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
463 data_compressed_length=new_data_size, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
464 data_uncompressed_length=new_data_size, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
465 data_delta_base=rev, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
466 link_rev=link_rev, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
467 parent_rev_1=p1, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
468 parent_rev_2=p2, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
469 node_id=entry[ENTRY_NODE_ID], |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
470 sidedata_offset=0, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
471 sidedata_compressed_length=0, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
472 data_compression_mode=COMP_MODE_PLAIN, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
473 sidedata_compression_mode=COMP_MODE_PLAIN, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
474 ) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
475 revlog.index.append(new_entry) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
476 entry_bin = revlog.index.entry_binary(rev) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
477 new_index_file.write(entry_bin) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
478 revlog._docket.index_end = new_index_file.tell() |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47466
diff
changeset
|
479 revlog._docket.data_end = new_data_file.tell() |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
480 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
481 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
482 def _get_filename_from_filelog_index(path): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
483 # Drop the extension and the `data/` prefix |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
484 path_part = path.rsplit(b'.', 1)[0].split(b'/', 1) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
485 if len(path_part) < 2: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
486 msg = _(b"cannot recognize filelog from filename: '%s'") |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
487 msg %= path |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
488 raise error.Abort(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
489 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
490 return path_part[1] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
491 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
492 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
493 def _filelog_from_filename(repo, path): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
494 """Returns the filelog for the given `path`. Stolen from `engine.py`""" |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
495 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
496 from .. import filelog # avoid cycle |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
497 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
498 fl = filelog.filelog(repo.svfs, path) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
499 return fl |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
500 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
501 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
502 def _write_swapped_parents(repo, rl, rev, offset, fp): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
503 """Swaps p1 and p2 and overwrites the revlog entry for `rev` in `fp`""" |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
504 from ..pure import parsers # avoid cycle |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
505 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
506 if repo._currentlock(repo._lockref) is None: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
507 # Let's be paranoid about it |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
508 msg = "repo needs to be locked to rewrite parents" |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
509 raise error.ProgrammingError(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
510 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
511 index_format = parsers.IndexObject.index_format |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
512 entry = rl.index[rev] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
513 new_entry = list(entry) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
514 new_entry[5], new_entry[6] = entry[6], entry[5] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
515 packed = index_format.pack(*new_entry[:8]) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
516 fp.seek(offset) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
517 fp.write(packed) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
518 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
519 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
520 def _reorder_filelog_parents(repo, fl, to_fix): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
521 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
522 Swaps p1 and p2 for all `to_fix` revisions of filelog `fl` and writes the |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
523 new version to disk, overwriting the old one with a rename. |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
524 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
525 from ..pure import parsers # avoid cycle |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
526 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
527 ui = repo.ui |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
528 assert len(to_fix) > 0 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
529 rl = fl._revlog |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
530 if rl._format_version != constants.REVLOGV1: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
531 msg = "expected version 1 revlog, got version '%d'" % rl._format_version |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
532 raise error.ProgrammingError(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
533 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
534 index_file = rl._indexfile |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
535 new_file_path = index_file + b'.tmp-parents-fix' |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
536 repaired_msg = _(b"repaired revision %d of 'filelog %s'\n") |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
537 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
538 with ui.uninterruptible(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
539 try: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
540 util.copyfile( |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
541 rl.opener.join(index_file), |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
542 rl.opener.join(new_file_path), |
51048
59c6f99723b1
revlog: remove legacy usage of `_checkambig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
543 checkambig=rl.data_config.check_ambig, |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
544 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
545 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
546 with rl.opener(new_file_path, mode=b"r+") as fp: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
547 if rl._inline: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
548 index = parsers.InlinedIndexObject(fp.read()) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
549 for rev in fl.revs(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
550 if rev in to_fix: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
551 offset = index._calculate_index(rev) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
552 _write_swapped_parents(repo, rl, rev, offset, fp) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
553 ui.write(repaired_msg % (rev, index_file)) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
554 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
555 index_format = parsers.IndexObject.index_format |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
556 for rev in to_fix: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
557 offset = rev * index_format.size |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
558 _write_swapped_parents(repo, rl, rev, offset, fp) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
559 ui.write(repaired_msg % (rev, index_file)) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
560 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
561 rl.opener.rename(new_file_path, index_file) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
562 rl.clearcaches() |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
563 rl._loadindex() |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
564 finally: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
565 util.tryunlink(new_file_path) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
566 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
567 |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
568 def _is_revision_affected(fl, filerev, metadata_cache=None): |
47818
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
569 full_text = lambda: fl._revlog.rawdata(filerev) |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
570 parent_revs = lambda: fl._revlog.parentrevs(filerev) |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
571 return _is_revision_affected_inner( |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
572 full_text, parent_revs, filerev, metadata_cache |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
573 ) |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
574 |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
575 |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
576 def _is_revision_affected_inner( |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
577 full_text, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
578 parents_revs, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
579 filerev, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
580 metadata_cache=None, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
581 ): |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
582 """Mercurial currently (5.9rc0) uses `p1 == nullrev and p2 != nullrev` as a |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
583 special meaning compared to the reverse in the context of filelog-based |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
584 copytracing. issue6528 exists because new code assumed that parent ordering |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
585 didn't matter, so this detects if the revision contains metadata (since |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
586 it's only used for filelog-based copytracing) and its parents are in the |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
587 "wrong" order.""" |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
588 try: |
47818
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
589 raw_text = full_text() |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
590 except error.CensoredNodeError: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
591 # We don't care about censored nodes as they never carry metadata |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
592 return False |
48245
531d26b1390a
rewrite: fix issue6599
Raphaël Gomès <rgomes@octobus.net>
parents:
47821
diff
changeset
|
593 |
531d26b1390a
rewrite: fix issue6599
Raphaël Gomès <rgomes@octobus.net>
parents:
47821
diff
changeset
|
594 # raw text can be a `memoryview`, which doesn't implement `startswith` |
531d26b1390a
rewrite: fix issue6599
Raphaël Gomès <rgomes@octobus.net>
parents:
47821
diff
changeset
|
595 has_meta = bytes(raw_text[:2]) == b'\x01\n' |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
596 if metadata_cache is not None: |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
597 metadata_cache[filerev] = has_meta |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
598 if has_meta: |
47818
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47817
diff
changeset
|
599 (p1, p2) = parents_revs() |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
600 if p1 != nullrev and p2 == nullrev: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
601 return True |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
602 return False |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
603 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
604 |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
605 def _is_revision_affected_fast(repo, fl, filerev, metadata_cache): |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
606 rl = fl._revlog |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
607 is_censored = lambda: rl.iscensored(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
608 delta_base = lambda: rl.deltaparent(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
609 delta = lambda: rl._chunk(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
610 full_text = lambda: rl.rawdata(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
611 parent_revs = lambda: rl.parentrevs(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
612 return _is_revision_affected_fast_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
613 is_censored, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
614 delta_base, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
615 delta, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
616 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
617 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
618 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
619 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
620 ) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
621 |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
622 |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
623 def _is_revision_affected_fast_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
624 is_censored, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
625 delta_base, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
626 delta, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
627 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
628 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
629 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
630 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
631 ): |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
632 """Optimization fast-path for `_is_revision_affected`. |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
633 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
634 `metadata_cache` is a dict of `{rev: has_metadata}` which allows any |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
635 revision to check if its base has metadata, saving computation of the full |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
636 text, instead looking at the current delta. |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
637 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
638 This optimization only works if the revisions are looked at in order.""" |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
639 |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
640 if is_censored(): |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
641 # Censored revisions don't contain metadata, so they cannot be affected |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
642 metadata_cache[filerev] = False |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
643 return False |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
644 |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
645 p1, p2 = parent_revs() |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
646 if p1 == nullrev or p2 != nullrev: |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
647 return False |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
648 |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
649 delta_parent = delta_base() |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
650 parent_has_metadata = metadata_cache.get(delta_parent) |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
651 if parent_has_metadata is None: |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
652 return _is_revision_affected_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
653 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
654 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
655 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
656 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
657 ) |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
658 |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
659 chunk = delta() |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
660 if not len(chunk): |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
661 # No diff for this revision |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
662 return parent_has_metadata |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
663 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
664 header_length = 12 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
665 if len(chunk) < header_length: |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
666 raise error.Abort(_(b"patch cannot be decoded")) |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
667 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
668 start, _end, _length = struct.unpack(b">lll", chunk[:header_length]) |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
669 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
670 if start < 2: # len(b'\x01\n') == 2 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
671 # This delta does *something* to the metadata marker (if any). |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
672 # Check it the slow way |
47819
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
673 is_affected = _is_revision_affected_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
674 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
675 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
676 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
677 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47818
diff
changeset
|
678 ) |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
679 return is_affected |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
680 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
681 # The diff did not remove or add the metadata header, it's then in the same |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
682 # situation as its parent |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
683 metadata_cache[filerev] = parent_has_metadata |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
684 return parent_has_metadata |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
685 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
686 |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
687 def _from_report(ui, repo, context, from_report, dry_run): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
688 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
689 Fix the revisions given in the `from_report` file, but still checks if the |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
690 revisions are indeed affected to prevent an unfortunate cyclic situation |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
691 where we'd swap well-ordered parents again. |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
692 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
693 See the doc for `debug_fix_issue6528` for the format documentation. |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
694 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
695 ui.write(_(b"loading report file '%s'\n") % from_report) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
696 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
697 with context(), open(from_report, mode='rb') as f: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
698 for line in f.read().split(b'\n'): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
699 if not line: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
700 continue |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
701 filenodes, filename = line.split(b' ', 1) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
702 fl = _filelog_from_filename(repo, filename) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
703 to_fix = set( |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
704 fl.rev(binascii.unhexlify(n)) for n in filenodes.split(b',') |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
705 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
706 excluded = set() |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
707 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
708 for filerev in to_fix: |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
709 if _is_revision_affected(fl, filerev): |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
710 msg = b"found affected revision %d for filelog '%s'\n" |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
711 ui.warn(msg % (filerev, filename)) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
712 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
713 msg = _(b"revision %s of file '%s' is not affected\n") |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
714 msg %= (binascii.hexlify(fl.node(filerev)), filename) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
715 ui.warn(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
716 excluded.add(filerev) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
717 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
718 to_fix = to_fix - excluded |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
719 if not to_fix: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
720 msg = _(b"no affected revisions were found for '%s'\n") |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
721 ui.write(msg % filename) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
722 continue |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
723 if not dry_run: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
724 _reorder_filelog_parents(repo, fl, sorted(to_fix)) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
725 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
726 |
47821
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
727 def filter_delta_issue6528(revlog, deltas_iter): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
728 """filter incomind deltas to repaire issue 6528 on the fly""" |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
729 metadata_cache = {} |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
730 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
731 deltacomputer = deltas.deltacomputer(revlog) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
732 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
733 for rev, d in enumerate(deltas_iter, len(revlog)): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
734 ( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
735 node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
736 p1_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
737 p2_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
738 linknode, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
739 deltabase, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
740 delta, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
741 flags, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
742 sidedata, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
743 ) = d |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
744 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
745 if not revlog.index.has_node(deltabase): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
746 raise error.LookupError( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
747 deltabase, revlog.radix, _(b'unknown parent') |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
748 ) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
749 base_rev = revlog.rev(deltabase) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
750 if not revlog.index.has_node(p1_node): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
751 raise error.LookupError(p1_node, revlog.radix, _(b'unknown parent')) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
752 p1_rev = revlog.rev(p1_node) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
753 if not revlog.index.has_node(p2_node): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
754 raise error.LookupError(p2_node, revlog.radix, _(b'unknown parent')) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
755 p2_rev = revlog.rev(p2_node) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
756 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
757 is_censored = lambda: bool(flags & REVIDX_ISCENSORED) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
758 delta_base = lambda: revlog.rev(delta_base) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
759 delta_base = lambda: base_rev |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
760 parent_revs = lambda: (p1_rev, p2_rev) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
761 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
762 def full_text(): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
763 # note: being able to reuse the full text computation in the |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
764 # underlying addrevision would be useful however this is a bit too |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
765 # intrusive the for the "quick" issue6528 we are writing before the |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
766 # 5.8 release |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
767 textlen = mdiff.patchedsize(revlog.size(base_rev), delta) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
768 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
769 revinfo = revlogutils.revisioninfo( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
770 node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
771 p1_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
772 p2_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
773 [None], |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
774 textlen, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
775 (base_rev, delta), |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
776 flags, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
777 ) |
51020
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51019
diff
changeset
|
778 return deltacomputer.buildtext(revinfo) |
47821
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
779 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
780 is_affected = _is_revision_affected_fast_inner( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
781 is_censored, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
782 delta_base, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
783 lambda: delta, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
784 full_text, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
785 parent_revs, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
786 rev, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
787 metadata_cache, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
788 ) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
789 if is_affected: |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
790 d = ( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
791 node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
792 p2_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
793 p1_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
794 linknode, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
795 deltabase, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
796 delta, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
797 flags, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
798 sidedata, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
799 ) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
800 yield d |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
801 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47819
diff
changeset
|
802 |
47817
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
803 def repair_issue6528( |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
804 ui, repo, dry_run=False, to_report=None, from_report=None, paranoid=False |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
805 ): |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
806 @contextlib.contextmanager |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
807 def context(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
808 if dry_run or to_report: # No need for locking |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
809 yield |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
810 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
811 with repo.wlock(), repo.lock(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
812 yield |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
813 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
814 if from_report: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
815 return _from_report(ui, repo, context, from_report, dry_run) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
816 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
817 report_entries = [] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
818 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
819 with context(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
820 files = list( |
50471
521fec115dad
store: use a StoreEntry object instead of tuple for store files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50464
diff
changeset
|
821 entry |
50504
862e3a13da44
store: rename `datafiles` to `data_entries`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50500
diff
changeset
|
822 for entry in repo.store.data_entries() |
50500
0bd214f83216
store: use the boolean property in `repair_issue6528`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50496
diff
changeset
|
823 if entry.is_revlog and entry.is_filelog |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
824 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
825 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
826 progress = ui.makeprogress( |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
827 _(b"looking for affected revisions"), |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
828 unit=_(b"filelogs"), |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
829 total=len(files), |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
830 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
831 found_nothing = True |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
832 |
50471
521fec115dad
store: use a StoreEntry object instead of tuple for store files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50464
diff
changeset
|
833 for entry in files: |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
834 progress.increment() |
50486
85c5b4b507af
store: use StoreEntry API instead of parsing filename when fixing issue6528
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50471
diff
changeset
|
835 filename = entry.target_id |
85c5b4b507af
store: use StoreEntry API instead of parsing filename when fixing issue6528
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50471
diff
changeset
|
836 fl = _filelog_from_filename(repo, entry.target_id) |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
837 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
838 # Set of filerevs (or hex filenodes if `to_report`) that need fixing |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
839 to_fix = set() |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
840 metadata_cache = {} |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
841 for filerev in fl.revs(): |
47816
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
842 affected = _is_revision_affected_fast( |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
843 repo, fl, filerev, metadata_cache |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47815
diff
changeset
|
844 ) |
47817
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
845 if paranoid: |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
846 slow = _is_revision_affected(fl, filerev) |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
847 if slow != affected: |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
848 msg = _(b"paranoid check failed for '%s' at node %s") |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
849 node = binascii.hexlify(fl.node(filerev)) |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Raphaël Gomès <rgomes@octobus.net>
parents:
47816
diff
changeset
|
850 raise error.Abort(msg % (filename, node)) |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
851 if affected: |
50486
85c5b4b507af
store: use StoreEntry API instead of parsing filename when fixing issue6528
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50471
diff
changeset
|
852 msg = b"found affected revision %d for file '%s'\n" |
85c5b4b507af
store: use StoreEntry API instead of parsing filename when fixing issue6528
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50471
diff
changeset
|
853 ui.warn(msg % (filerev, filename)) |
47815
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
854 found_nothing = False |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
855 if not dry_run: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
856 if to_report: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
857 to_fix.add(binascii.hexlify(fl.node(filerev))) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
858 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
859 to_fix.add(filerev) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
860 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
861 if to_fix: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
862 to_fix = sorted(to_fix) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
863 if to_report: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
864 report_entries.append((filename, to_fix)) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
865 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
866 _reorder_filelog_parents(repo, fl, to_fix) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
867 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
868 if found_nothing: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
869 ui.write(_(b"no affected revisions were found\n")) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
870 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
871 if to_report and report_entries: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
872 with open(to_report, mode="wb") as f: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
873 for path, to_fix in report_entries: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
874 f.write(b"%s %s\n" % (b",".join(to_fix), path)) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
875 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Raphaël Gomès <rgomes@octobus.net>
parents:
47473
diff
changeset
|
876 progress.complete() |