Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/revlogutils/rewrite.py @ 51951:3dbbb7d913a9
revlogutils: remember known metadata parents for issue6528
In the cases where the parent revs tell us for sure that the parent has
metadata, remember this fact to avoid content recomputations later.
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Sat, 20 Jul 2024 00:43:08 +0200 |
parents | 576876a518e1 |
children | 6223892833db |
rev | line source |
---|---|
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
1 # censor code related to censoring revision |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
2 # coding: utf8 |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
4 # Copyright 2021 Pierre-Yves David <pierre-yves.david@octobus.net> |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
5 # Copyright 2015 Google, Inc <martinvonz@google.com> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
9 |
51902
1c5810ce737e
typing: add `from __future__ import annotations` to remaining source files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
10 from __future__ import annotations |
1c5810ce737e
typing: add `from __future__ import annotations` to remaining source files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
11 |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
12 import binascii |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
13 import contextlib |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
14 import os |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
15 import struct |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
16 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
17 from ..node import ( |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
18 nullrev, |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
19 ) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
20 from .constants import ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
21 COMP_MODE_PLAIN, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
22 ENTRY_DATA_COMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
23 ENTRY_DATA_COMPRESSION_MODE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
24 ENTRY_DATA_OFFSET, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
25 ENTRY_DATA_UNCOMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
26 ENTRY_DELTA_BASE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
27 ENTRY_LINK_REV, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
28 ENTRY_NODE_ID, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
29 ENTRY_PARENT_1, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
30 ENTRY_PARENT_2, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
31 ENTRY_SIDEDATA_COMPRESSED_LENGTH, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
32 ENTRY_SIDEDATA_COMPRESSION_MODE, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
33 ENTRY_SIDEDATA_OFFSET, |
47816
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
34 REVIDX_ISCENSORED, |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
35 REVLOGV0, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
36 REVLOGV1, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
37 ) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
38 from ..i18n import _ |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
39 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
40 from .. import ( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
41 error, |
47816
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
42 mdiff, |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
43 pycompat, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
44 revlogutils, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
45 util, |
46310
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
46 ) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
47 from ..utils import ( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
48 storageutil, |
47392
0d0fb091c49f
revlog: simplify "partial read" error message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47391
diff
changeset
|
49 ) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
50 from . import ( |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
51 constants, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
52 deltas, |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
53 ) |
47257
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
54 |
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
55 |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
56 def v1_censor(rl, tr, censor_nodes, tombstone=b''): |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
57 """censors a revision in a "version 1" revlog""" |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
58 assert rl._format_version == constants.REVLOGV1, rl._format_version |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
59 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
60 # avoid cycle |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
61 from .. import revlog |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
62 |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
63 censor_revs = set(rl.rev(node) for node in censor_nodes) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
64 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30014
diff
changeset
|
65 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
66 # Rewriting the revlog in place is hard. Our strategy for censoring is |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
67 # to create a new revlog, copy all revisions to it, then replace the |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
68 # revlogs on transaction close. |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
69 # |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
70 # This is a bit dangerous. We could easily have a mismatch of state. |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
71 newrl = revlog.revlog( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
72 rl.opener, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
73 target=rl.target, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
74 radix=rl.radix, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
75 postfix=b'tmpcensored', |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
76 censorable=True, |
51140
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
77 data_config=rl.data_config, |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
78 delta_config=rl.delta_config, |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
79 feature_config=rl.feature_config, |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
80 may_inline=rl._inline, |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
81 ) |
51140
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
82 # inline splitting will prepare some transaction work that will get |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
83 # confused by the final file move. So if there is a risk of not being |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
84 # inline at the end, we prevent the new revlog to be inline in the first |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
85 # place. |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
86 assert not (newrl._inline and not rl._inline) |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
87 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
88 for rev in rl.revs(): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
89 node = rl.node(rev) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
90 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
|
91 |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
92 if rev in censor_revs: |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
93 newrl.addrawrevision( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
94 tombstone, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
95 tr, |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
96 rl.linkrev(rev), |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
97 p1, |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
98 p2, |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
99 node, |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
100 constants.REVIDX_ISCENSORED, |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
101 ) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
102 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
103 if newrl.deltaparent(rev) != nullrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
104 m = _(b'censored revision stored as delta; cannot censor') |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
105 h = _( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
106 b'censoring of revlogs is not fully implemented;' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
107 b' please report this bug' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
108 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
109 raise error.Abort(m, hint=h) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
110 continue |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
111 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
112 if rl.iscensored(rev): |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
113 if rl.deltaparent(rev) != nullrev: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
114 m = _( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
115 b'cannot censor due to censored ' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
116 b'revision having delta stored' |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
117 ) |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
118 raise error.Abort(m) |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
119 rawtext = rl._inner._chunk(rev) |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
120 else: |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
121 rawtext = rl.rawdata(rev) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
122 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
123 newrl.addrawrevision( |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
124 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
|
125 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
126 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
127 tr.addbackup(rl._indexfile, location=b'store') |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
128 if not rl._inline: |
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
129 tr.addbackup(rl._datafile, location=b'store') |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
130 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
131 rl.opener.rename(newrl._indexfile, rl._indexfile) |
51140
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
132 if newrl._inline: |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
133 assert rl._inline |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
134 else: |
3e2a878fb96f
censor: fix things around inlining
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
135 assert not rl._inline |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
136 rl.opener.rename(newrl._datafile, rl._datafile) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
137 |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
138 rl.clearcaches() |
51091
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51053
diff
changeset
|
139 chunk_cache = rl._loadindex() |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51053
diff
changeset
|
140 rl._load_inner(chunk_cache) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
141 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
142 |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
143 def v2_censor(revlog, tr, censor_nodes, tombstone=b''): |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
144 """censors a revision in a "version 2" revlog""" |
47478
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
145 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:
47477
diff
changeset
|
146 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:
47477
diff
changeset
|
147 |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51140
diff
changeset
|
148 censor_revs = {revlog.rev(node) for node in censor_nodes} |
47478
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
149 _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:
47477
diff
changeset
|
150 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
151 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
152 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:
47477
diff
changeset
|
153 """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:
47477
diff
changeset
|
154 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
155 General principle |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
156 |
47478
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
157 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:
47477
diff
changeset
|
158 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:
47477
diff
changeset
|
159 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
160 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:
47477
diff
changeset
|
161 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:
47477
diff
changeset
|
162 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:
47477
diff
changeset
|
163 final destination. |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
164 |
5045ba2a3afd
censor: split the core of the logic into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47477
diff
changeset
|
165 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:
47477
diff
changeset
|
166 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:
47477
diff
changeset
|
167 """ |
47476
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47475
diff
changeset
|
168 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:
47475
diff
changeset
|
169 assert revlog._format_version != REVLOGV1, revlog._format_version |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
170 |
47476
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47475
diff
changeset
|
171 old_index = revlog.index |
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47475
diff
changeset
|
172 docket = revlog._docket |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
173 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
174 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
175 |
47477
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
176 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:
47476
diff
changeset
|
177 |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
178 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:
47476
diff
changeset
|
179 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:
47476
diff
changeset
|
180 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:
47476
diff
changeset
|
181 sidedata_cutoff = revlog.sidedata_cut_off(first_excl_rev) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
182 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
183 with pycompat.unnamedtempfile(mode=b"w+b") as tmp_storage: |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
184 # 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:
47473
diff
changeset
|
185 rewritten_entries = _precompute_rewritten_delta( |
47476
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47475
diff
changeset
|
186 revlog, |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
187 old_index, |
47477
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
188 censor_revs, |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
189 tmp_storage, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
190 ) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
191 |
47475
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
192 all_files = _setup_new_files( |
47476
aab064416f0c
censor: rename `rl` to `revlog` in the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47475
diff
changeset
|
193 revlog, |
47475
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
194 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:
47474
diff
changeset
|
195 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:
47474
diff
changeset
|
196 sidedata_cutoff, |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
197 ) |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
198 |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
199 # we dont need to open the old index file since its content already |
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
200 # exist in a usable form in `old_index`. |
47471
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
201 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:
47470
diff
changeset
|
202 ( |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
203 old_data_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
204 old_sidedata_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
205 new_index_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
206 new_data_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
207 new_sidedata_file, |
f7a94e2d4470
censor: put the tuple of open files in an explicit variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47470
diff
changeset
|
208 ) = open_files |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
209 |
47472
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
210 # writing the censored revision |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
211 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
212 # Writing all subsequent revisions |
47477
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
213 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:
47476
diff
changeset
|
214 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:
47476
diff
changeset
|
215 _rewrite_censor( |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
216 revlog, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
217 old_index, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
218 open_files, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
219 rev, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
220 tombstone, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
221 ) |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
222 else: |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
223 _rewrite_simple( |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
224 revlog, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
225 old_index, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
226 open_files, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
227 rev, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
228 rewritten_entries, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
229 tmp_storage, |
c81a5297f185
censor: migrate the logic to a set of `censor_revs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47476
diff
changeset
|
230 ) |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
231 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:
47472
diff
changeset
|
232 |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
233 |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
234 def _precompute_rewritten_delta( |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
235 revlog, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
236 old_index, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
237 excluded_revs, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
238 tmp_storage, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
239 ): |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
240 """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:
47473
diff
changeset
|
241 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:
47473
diff
changeset
|
242 |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
243 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:
47473
diff
changeset
|
244 """ |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
245 dc = deltas.deltacomputer(revlog) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
246 rewritten_entries = {} |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
247 first_excl_rev = min(excluded_revs) |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51024
diff
changeset
|
248 with revlog.reading(): |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
249 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:
47473
diff
changeset
|
250 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:
47473
diff
changeset
|
251 # 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:
47473
diff
changeset
|
252 # consider recomputing a delta. |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
253 continue |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
254 entry = old_index[rev] |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
255 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:
47473
diff
changeset
|
256 continue |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
257 # 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:
47473
diff
changeset
|
258 # 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:
47473
diff
changeset
|
259 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:
47473
diff
changeset
|
260 # 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:
47473
diff
changeset
|
261 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:
47473
diff
changeset
|
262 else: |
51024
66c139d33cfe
censors: simply use `revlog.reading` to keep things open dring rewrite
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50538
diff
changeset
|
263 text = revlog.rawdata(rev) |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
264 info = revlogutils.revisioninfo( |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
265 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:
47473
diff
changeset
|
266 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:
47473
diff
changeset
|
267 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:
47473
diff
changeset
|
268 btext=[text], |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
269 textlen=len(text), |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
270 cachedelta=None, |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
271 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:
47473
diff
changeset
|
272 ) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
273 d = dc.finddeltainfo( |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51024
diff
changeset
|
274 info, excluded_bases=excluded_revs, target_rev=rev |
47474
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
275 ) |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
276 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:
47473
diff
changeset
|
277 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:
47473
diff
changeset
|
278 # 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:
47473
diff
changeset
|
279 start = tmp_storage.tell() |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
280 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:
47473
diff
changeset
|
281 end = tmp_storage.tell() |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
282 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:
47473
diff
changeset
|
283 return rewritten_entries |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
284 |
60c48458ee6c
censor: extract the part about recomputing delta in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47473
diff
changeset
|
285 |
47475
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
286 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:
47474
diff
changeset
|
287 revlog, |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
288 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:
47474
diff
changeset
|
289 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:
47474
diff
changeset
|
290 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:
47474
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:
47474
diff
changeset
|
292 """ |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
293 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
294 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:
47474
diff
changeset
|
295 - 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:
47474
diff
changeset
|
296 - 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:
47474
diff
changeset
|
297 - 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:
47474
diff
changeset
|
298 - 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:
47474
diff
changeset
|
299 - 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:
47474
diff
changeset
|
300 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
301 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:
47474
diff
changeset
|
302 `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:
47474
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:
47474
diff
changeset
|
304 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:
47474
diff
changeset
|
305 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:
47474
diff
changeset
|
306 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:
47474
diff
changeset
|
307 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:
47474
diff
changeset
|
308 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
309 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:
47474
diff
changeset
|
310 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:
47474
diff
changeset
|
311 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:
47474
diff
changeset
|
312 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
313 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:
47474
diff
changeset
|
314 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:
47474
diff
changeset
|
315 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:
47474
diff
changeset
|
316 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:
47474
diff
changeset
|
317 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:
47474
diff
changeset
|
318 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:
47474
diff
changeset
|
319 ) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
320 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:
47474
diff
changeset
|
321 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:
47474
diff
changeset
|
322 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:
47474
diff
changeset
|
323 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
324 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:
47474
diff
changeset
|
325 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:
47474
diff
changeset
|
326 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:
47474
diff
changeset
|
327 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
328 # 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:
47474
diff
changeset
|
329 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:
47474
diff
changeset
|
330 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:
47474
diff
changeset
|
331 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
332 @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:
47474
diff
changeset
|
333 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:
47474
diff
changeset
|
334 # 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:
47474
diff
changeset
|
335 # 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:
47474
diff
changeset
|
336 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:
47474
diff
changeset
|
337 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:
47474
diff
changeset
|
338 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:
47474
diff
changeset
|
339 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:
47474
diff
changeset
|
340 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:
47474
diff
changeset
|
341 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:
47474
diff
changeset
|
342 ) 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:
47474
diff
changeset
|
343 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:
47474
diff
changeset
|
344 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:
47474
diff
changeset
|
345 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:
47474
diff
changeset
|
346 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:
47474
diff
changeset
|
347 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:
47474
diff
changeset
|
348 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:
47474
diff
changeset
|
349 yield ( |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
350 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:
47474
diff
changeset
|
351 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:
47474
diff
changeset
|
352 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:
47474
diff
changeset
|
353 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:
47474
diff
changeset
|
354 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:
47474
diff
changeset
|
355 ) |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
356 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
357 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:
47474
diff
changeset
|
358 |
d6afe1478a2a
censor: extract the part about creating and opening new files in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47474
diff
changeset
|
359 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
360 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:
47472
diff
changeset
|
361 revlog, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
362 old_index, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
363 all_files, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
364 rev, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
365 rewritten_entries, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
366 tmp_storage, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
367 ): |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
368 """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:
47472
diff
changeset
|
369 ( |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
370 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:
47472
diff
changeset
|
371 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:
47472
diff
changeset
|
372 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:
47472
diff
changeset
|
373 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:
47472
diff
changeset
|
374 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:
47472
diff
changeset
|
375 ) = all_files |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
376 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:
47472
diff
changeset
|
377 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:
47472
diff
changeset
|
378 old_data_offset = entry[ENTRY_DATA_OFFSET] >> 16 |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
379 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
380 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:
47472
diff
changeset
|
381 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:
47472
diff
changeset
|
382 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:
47472
diff
changeset
|
383 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:
47472
diff
changeset
|
384 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:
47472
diff
changeset
|
385 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:
47472
diff
changeset
|
386 else: |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
387 ( |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
388 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:
47472
diff
changeset
|
389 start, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
390 end, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
391 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:
47472
diff
changeset
|
392 ) = 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:
47472
diff
changeset
|
393 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:
47472
diff
changeset
|
394 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:
47472
diff
changeset
|
395 new_data = tmp_storage.read(new_data_size) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
396 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
397 # 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:
47472
diff
changeset
|
398 # 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:
47472
diff
changeset
|
399 # 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:
47472
diff
changeset
|
400 # optimisation yet. |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
401 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:
47472
diff
changeset
|
402 new_data_file.write(new_data) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
403 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
404 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:
47472
diff
changeset
|
405 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:
47472
diff
changeset
|
406 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:
47472
diff
changeset
|
407 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:
47472
diff
changeset
|
408 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:
47472
diff
changeset
|
409 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:
47472
diff
changeset
|
410 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:
47472
diff
changeset
|
411 |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
412 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:
47472
diff
changeset
|
413 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:
47472
diff
changeset
|
414 assert data_delta_base <= rev, (data_delta_base, rev) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
415 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
416 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:
47472
diff
changeset
|
417 flags=flags, |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
418 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:
47472
diff
changeset
|
419 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:
47472
diff
changeset
|
420 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:
47472
diff
changeset
|
421 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:
47472
diff
changeset
|
422 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:
47472
diff
changeset
|
423 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:
47472
diff
changeset
|
424 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:
47472
diff
changeset
|
425 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:
47472
diff
changeset
|
426 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:
47472
diff
changeset
|
427 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:
47472
diff
changeset
|
428 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:
47472
diff
changeset
|
429 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:
47472
diff
changeset
|
430 ) |
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
431 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:
47472
diff
changeset
|
432 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:
47472
diff
changeset
|
433 new_index_file.write(entry_bin) |
47463
f8330a3fc39f
censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47398
diff
changeset
|
434 |
47473
9b70aa7bcbab
censor: extract the part about writing the other revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47472
diff
changeset
|
435 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:
47472
diff
changeset
|
436 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:
47472
diff
changeset
|
437 revlog._docket.sidedata_end = new_sidedata_file.tell() |
47472
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
438 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
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:
47471
diff
changeset
|
440 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:
47471
diff
changeset
|
441 revlog, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
442 old_index, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
443 all_files, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
444 rev, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
445 tombstone, |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
446 ): |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
447 """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:
47471
diff
changeset
|
448 ( |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
449 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:
47471
diff
changeset
|
450 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:
47471
diff
changeset
|
451 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:
47471
diff
changeset
|
452 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:
47471
diff
changeset
|
453 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:
47471
diff
changeset
|
454 ) = all_files |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
455 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:
47471
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:
47471
diff
changeset
|
457 # 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:
47471
diff
changeset
|
458 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:
47471
diff
changeset
|
459 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:
47471
diff
changeset
|
460 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:
47471
diff
changeset
|
461 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
462 # 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:
47471
diff
changeset
|
463 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
464 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:
47471
diff
changeset
|
465 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
466 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:
47471
diff
changeset
|
467 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:
47471
diff
changeset
|
468 |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
469 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:
47471
diff
changeset
|
470 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:
47471
diff
changeset
|
471 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:
47471
diff
changeset
|
472 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:
47471
diff
changeset
|
473 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:
47471
diff
changeset
|
474 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:
47471
diff
changeset
|
475 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:
47471
diff
changeset
|
476 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:
47471
diff
changeset
|
477 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:
47471
diff
changeset
|
478 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:
47471
diff
changeset
|
479 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:
47471
diff
changeset
|
480 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:
47471
diff
changeset
|
481 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:
47471
diff
changeset
|
482 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:
47471
diff
changeset
|
483 ) |
3ab267f0cbe4
censor: extract the part about writing the censored revision in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47471
diff
changeset
|
484 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:
47471
diff
changeset
|
485 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:
47471
diff
changeset
|
486 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:
47471
diff
changeset
|
487 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:
47471
diff
changeset
|
488 revlog._docket.data_end = new_data_file.tell() |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
489 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
490 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
491 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:
47478
diff
changeset
|
492 # 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:
47478
diff
changeset
|
493 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:
47478
diff
changeset
|
494 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:
47478
diff
changeset
|
495 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:
47478
diff
changeset
|
496 msg %= path |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
497 raise error.Abort(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
498 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
499 return path_part[1] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
500 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
501 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
502 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:
47478
diff
changeset
|
503 """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:
47478
diff
changeset
|
504 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
505 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:
47478
diff
changeset
|
506 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
507 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:
47478
diff
changeset
|
508 return fl |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
509 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
510 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
511 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:
47478
diff
changeset
|
512 """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:
47478
diff
changeset
|
513 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:
47478
diff
changeset
|
514 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
515 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:
47478
diff
changeset
|
516 # 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:
47478
diff
changeset
|
517 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:
47478
diff
changeset
|
518 raise error.ProgrammingError(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
519 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
520 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:
47478
diff
changeset
|
521 entry = rl.index[rev] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
522 new_entry = list(entry) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
523 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:
47478
diff
changeset
|
524 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:
47478
diff
changeset
|
525 fp.seek(offset) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
526 fp.write(packed) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
527 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
528 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
529 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:
47478
diff
changeset
|
530 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
531 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:
47478
diff
changeset
|
532 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:
47478
diff
changeset
|
533 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
534 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:
47478
diff
changeset
|
535 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
536 ui = repo.ui |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
537 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:
47478
diff
changeset
|
538 rl = fl._revlog |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
539 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:
47478
diff
changeset
|
540 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:
47478
diff
changeset
|
541 raise error.ProgrammingError(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
542 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
543 index_file = rl._indexfile |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
544 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:
47478
diff
changeset
|
545 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:
47478
diff
changeset
|
546 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
547 with ui.uninterruptible(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
548 try: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
549 util.copyfile( |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
550 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:
47478
diff
changeset
|
551 rl.opener.join(new_file_path), |
51053
59c6f99723b1
revlog: remove legacy usage of `_checkambig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51051
diff
changeset
|
552 checkambig=rl.data_config.check_ambig, |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
553 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
554 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
555 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:
47478
diff
changeset
|
556 if rl._inline: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
557 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:
47478
diff
changeset
|
558 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:
47478
diff
changeset
|
559 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:
47478
diff
changeset
|
560 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:
47478
diff
changeset
|
561 _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:
47478
diff
changeset
|
562 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:
47478
diff
changeset
|
563 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
564 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:
47478
diff
changeset
|
565 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:
47478
diff
changeset
|
566 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:
47478
diff
changeset
|
567 _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:
47478
diff
changeset
|
568 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:
47478
diff
changeset
|
569 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
570 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:
47478
diff
changeset
|
571 rl.clearcaches() |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
572 rl._loadindex() |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
573 finally: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
574 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:
47478
diff
changeset
|
575 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
576 |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
577 def _is_revision_affected(fl, filerev, metadata_cache=None): |
47813
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
578 full_text = lambda: fl._revlog.rawdata(filerev) |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
579 parent_revs = lambda: fl._revlog.parentrevs(filerev) |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
580 return _is_revision_affected_inner( |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
581 full_text, parent_revs, filerev, metadata_cache |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
582 ) |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
583 |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
584 |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
585 def _is_revision_affected_inner( |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
586 full_text, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
587 parents_revs, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
588 filerev, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
589 metadata_cache=None, |
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
590 ): |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
591 """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:
47478
diff
changeset
|
592 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:
47478
diff
changeset
|
593 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:
47478
diff
changeset
|
594 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:
47478
diff
changeset
|
595 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:
47478
diff
changeset
|
596 "wrong" order.""" |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
597 try: |
47813
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
598 raw_text = full_text() |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
599 except error.CensoredNodeError: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
600 # 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:
47478
diff
changeset
|
601 return False |
47893
531d26b1390a
rewrite: fix issue6599
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47816
diff
changeset
|
602 |
531d26b1390a
rewrite: fix issue6599
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47816
diff
changeset
|
603 # raw text can be a `memoryview`, which doesn't implement `startswith` |
531d26b1390a
rewrite: fix issue6599
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47816
diff
changeset
|
604 has_meta = bytes(raw_text[:2]) == b'\x01\n' |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
605 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:
47810
diff
changeset
|
606 metadata_cache[filerev] = has_meta |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
607 if has_meta: |
47813
5b046c2e3000
issue6528: implement _is_revision_affected using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47812
diff
changeset
|
608 (p1, p2) = parents_revs() |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
609 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:
47478
diff
changeset
|
610 return True |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
611 return False |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
612 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
613 |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
614 def _is_revision_affected_fast(repo, fl, filerev, metadata_cache): |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
615 rl = fl._revlog |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
616 is_censored = lambda: rl.iscensored(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
617 delta_base = lambda: rl.deltaparent(filerev) |
51948
767f47fc9d42
revlogutils: fix _chunk() reference
Joerg Sonnenberger <joerg@bec.de>
parents:
51902
diff
changeset
|
618 delta = lambda: rl._inner._chunk(filerev) |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
619 full_text = lambda: rl.rawdata(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
620 parent_revs = lambda: rl.parentrevs(filerev) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
621 return _is_revision_affected_fast_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
622 is_censored, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
623 delta_base, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
624 delta, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
625 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
626 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
627 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
628 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
629 ) |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
630 |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
631 |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
632 def _is_revision_affected_fast_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
633 is_censored, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
634 delta_base, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
635 delta, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
636 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
637 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
638 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
639 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
640 ): |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
641 """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:
47810
diff
changeset
|
642 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
643 `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:
47810
diff
changeset
|
644 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:
47810
diff
changeset
|
645 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:
47810
diff
changeset
|
646 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
647 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:
47810
diff
changeset
|
648 |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
649 if is_censored(): |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
650 # 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:
47810
diff
changeset
|
651 metadata_cache[filerev] = False |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
652 return False |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
653 |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
654 p1, p2 = parent_revs() |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
655 if p1 == nullrev or p2 != nullrev: |
51951
3dbbb7d913a9
revlogutils: remember known metadata parents for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
51950
diff
changeset
|
656 metadata_cache[filerev] = True |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
657 return False |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
658 |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
659 delta_parent = delta_base() |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
660 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:
47810
diff
changeset
|
661 if parent_has_metadata is None: |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
662 return _is_revision_affected_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
663 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
664 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
665 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
666 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
667 ) |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
668 |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
669 chunk = delta() |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
670 if not len(chunk): |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
671 # No diff for this revision |
51949
82a94a956c54
revlogutils: for issue6528 fix, cache results for null changes
Joerg Sonnenberger <joerg@bec.de>
parents:
51948
diff
changeset
|
672 metadata_cache[filerev] = parent_has_metadata |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
673 return parent_has_metadata |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
674 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
675 header_length = 12 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
676 if len(chunk) < header_length: |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
677 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:
47810
diff
changeset
|
678 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
679 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:
47810
diff
changeset
|
680 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
681 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:
47810
diff
changeset
|
682 # 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:
47810
diff
changeset
|
683 # Check it the slow way |
47814
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
684 is_affected = _is_revision_affected_inner( |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
685 full_text, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
686 parent_revs, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
687 filerev, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
688 metadata_cache, |
c02ce6def30c
issue6528: implement _is_revision_affected_fast using callback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47813
diff
changeset
|
689 ) |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
690 return is_affected |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
691 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
692 # 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:
47810
diff
changeset
|
693 # situation as its parent |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
694 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:
47810
diff
changeset
|
695 return parent_has_metadata |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
696 |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
697 |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
698 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:
47478
diff
changeset
|
699 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
700 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:
47478
diff
changeset
|
701 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:
47478
diff
changeset
|
702 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:
47478
diff
changeset
|
703 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
704 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:
47478
diff
changeset
|
705 """ |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
706 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:
47478
diff
changeset
|
707 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
708 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:
47478
diff
changeset
|
709 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:
47478
diff
changeset
|
710 if not line: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
711 continue |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
712 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:
47478
diff
changeset
|
713 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:
47478
diff
changeset
|
714 to_fix = set( |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
715 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:
47478
diff
changeset
|
716 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
717 excluded = set() |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
718 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
719 for filerev in to_fix: |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
720 if _is_revision_affected(fl, filerev): |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
721 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:
47478
diff
changeset
|
722 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:
47478
diff
changeset
|
723 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
724 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:
47478
diff
changeset
|
725 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:
47478
diff
changeset
|
726 ui.warn(msg) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
727 excluded.add(filerev) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
728 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
729 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:
47478
diff
changeset
|
730 if not to_fix: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
731 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:
47478
diff
changeset
|
732 ui.write(msg % filename) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
733 continue |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
734 if not dry_run: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
735 _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:
47478
diff
changeset
|
736 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
737 |
47816
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
738 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:
47814
diff
changeset
|
739 """filter incomind deltas to repaire issue 6528 on the fly""" |
51950
576876a518e1
revlogutils: for issue6528 fix, pre-cache nullrev as metadata-free
Joerg Sonnenberger <joerg@bec.de>
parents:
51949
diff
changeset
|
740 metadata_cache = {nullrev: False} |
47816
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
741 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
742 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:
47814
diff
changeset
|
743 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
744 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:
47814
diff
changeset
|
745 ( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
746 node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
747 p1_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
748 p2_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
749 linknode, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
750 deltabase, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
751 delta, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
752 flags, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
753 sidedata, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
754 ) = d |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
755 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
756 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:
47814
diff
changeset
|
757 raise error.LookupError( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
758 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:
47814
diff
changeset
|
759 ) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
760 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:
47814
diff
changeset
|
761 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:
47814
diff
changeset
|
762 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:
47814
diff
changeset
|
763 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:
47814
diff
changeset
|
764 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:
47814
diff
changeset
|
765 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:
47814
diff
changeset
|
766 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:
47814
diff
changeset
|
767 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
768 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:
47814
diff
changeset
|
769 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:
47814
diff
changeset
|
770 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:
47814
diff
changeset
|
771 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:
47814
diff
changeset
|
772 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
773 def full_text(): |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
774 # 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:
47814
diff
changeset
|
775 # 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:
47814
diff
changeset
|
776 # 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:
47814
diff
changeset
|
777 # 5.8 release |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
778 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:
47814
diff
changeset
|
779 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
780 revinfo = revlogutils.revisioninfo( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
781 node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
782 p1_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
783 p2_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
784 [None], |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
785 textlen, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
786 (base_rev, delta), |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
787 flags, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
788 ) |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51024
diff
changeset
|
789 return deltacomputer.buildtext(revinfo) |
47816
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
790 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
791 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:
47814
diff
changeset
|
792 is_censored, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
793 delta_base, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
794 lambda: delta, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
795 full_text, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
796 parent_revs, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
797 rev, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
798 metadata_cache, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
799 ) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
800 if is_affected: |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
801 d = ( |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
802 node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
803 p2_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
804 p1_node, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
805 linknode, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
806 deltabase, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
807 delta, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
808 flags, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
809 sidedata, |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
810 ) |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
811 yield d |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
812 |
c30ca163b45e
issue6528: also filter delta on the fly when applying a changegroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47814
diff
changeset
|
813 |
47812
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47811
diff
changeset
|
814 def repair_issue6528( |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47811
diff
changeset
|
815 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:
47811
diff
changeset
|
816 ): |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
817 @contextlib.contextmanager |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
818 def context(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
819 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:
47478
diff
changeset
|
820 yield |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
821 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
822 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:
47478
diff
changeset
|
823 yield |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
824 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
825 if from_report: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
826 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:
47478
diff
changeset
|
827 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
828 report_entries = [] |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
829 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
830 with context(): |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
831 files = list( |
50505
521fec115dad
store: use a StoreEntry object instead of tuple for store files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50498
diff
changeset
|
832 entry |
50538
862e3a13da44
store: rename `datafiles` to `data_entries`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50534
diff
changeset
|
833 for entry in repo.store.data_entries() |
50534
0bd214f83216
store: use the boolean property in `repair_issue6528`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50530
diff
changeset
|
834 if entry.is_revlog and entry.is_filelog |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
835 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
836 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
837 progress = ui.makeprogress( |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
838 _(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:
47478
diff
changeset
|
839 unit=_(b"filelogs"), |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
840 total=len(files), |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
841 ) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
842 found_nothing = True |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
843 |
50505
521fec115dad
store: use a StoreEntry object instead of tuple for store files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50498
diff
changeset
|
844 for entry in files: |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
845 progress.increment() |
50520
85c5b4b507af
store: use StoreEntry API instead of parsing filename when fixing issue6528
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50505
diff
changeset
|
846 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:
50505
diff
changeset
|
847 fl = _filelog_from_filename(repo, entry.target_id) |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
848 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
849 # 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:
47478
diff
changeset
|
850 to_fix = set() |
51950
576876a518e1
revlogutils: for issue6528 fix, pre-cache nullrev as metadata-free
Joerg Sonnenberger <joerg@bec.de>
parents:
51949
diff
changeset
|
851 metadata_cache = {nullrev: False} |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
852 for filerev in fl.revs(): |
47811
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
853 affected = _is_revision_affected_fast( |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
854 repo, fl, filerev, metadata_cache |
32e21ac3adb1
repair: improve performance of detection of revisions affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47810
diff
changeset
|
855 ) |
47812
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47811
diff
changeset
|
856 if paranoid: |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47811
diff
changeset
|
857 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:
47811
diff
changeset
|
858 if slow != affected: |
855463b5fe49
debugcommands: add a `--paranoid` option to `debug-repair-issue-6528`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47811
diff
changeset
|
859 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:
47811
diff
changeset
|
860 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:
47811
diff
changeset
|
861 raise error.Abort(msg % (filename, node)) |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
862 if affected: |
50520
85c5b4b507af
store: use StoreEntry API instead of parsing filename when fixing issue6528
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50505
diff
changeset
|
863 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:
50505
diff
changeset
|
864 ui.warn(msg % (filerev, filename)) |
47810
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
865 found_nothing = False |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
866 if not dry_run: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
867 if to_report: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
868 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:
47478
diff
changeset
|
869 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
870 to_fix.add(filerev) |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
871 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
872 if to_fix: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
873 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:
47478
diff
changeset
|
874 if to_report: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
875 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:
47478
diff
changeset
|
876 else: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
877 _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:
47478
diff
changeset
|
878 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
879 if found_nothing: |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
880 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:
47478
diff
changeset
|
881 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
882 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:
47478
diff
changeset
|
883 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:
47478
diff
changeset
|
884 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:
47478
diff
changeset
|
885 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:
47478
diff
changeset
|
886 |
b30a53ffbf9b
debugcommands: introduce a debug command to repair repos affected by issue6528
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47478
diff
changeset
|
887 progress.complete() |