Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/revlog.py @ 51143:849745d7da89 stable
revlog: avoid wrongly updating the data file location on "divert"
If we are in the inline case, we need to align the location of the "data" file
with the temporary location of the file (i.e. "00changelog.i.a"). However we
should not do that for non-inline case? and before this changeset we had been
doing it. In addition `index_file` is already a property taking care of updating
the "segment file" filename when needed. So we can simply remove all that code.
As a result, code trying to read the diverted data before they were committed
ended deeply confused as the "00changelog.i.a" file is nothing like the
"00changelog.d" file.
However nothing corrupted data as all writing where properly handled outside of
the "segment file".
In "best" cases this small in-memory corruption of the filename when unnoticed
until the transaction was committed or rolled back and in the worse case, some
data reading was failing during the transaction and resulted in the transaction
to be rolled back. However wrong data never reached the disk, so this bug should
be have corrupted any repository.
This is not catch by tests because most test use a small repository and
therefor an inline revlog. In addition the bug only triggers when a
changelog read is done in the following "rare" situation:
- after some delayed write
- after that data have been written in a "divert" file (i.e. `00.changelog.i.a`)
- before transaction commit
- outside of a "writing" context
The issue was introduced in d83d788590a8
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 06 Dec 2023 16:29:43 +0100 |
parents | 66417f55ea33 |
children | 77b86226dde2 dcaa2df1f688 |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # revlog.py - storage back-end for mercurial |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
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 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46807
diff
changeset
|
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # 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
|
8 |
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
9 """Storage back-end for Mercurial. |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
10 |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
11 This provides efficient delta storage with O(1) retrieve and append |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
12 and O(changes) merge between branches. |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
13 """ |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
14 |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
15 |
46852
fbfb1d6d8459
revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
46819
diff
changeset
|
16 import binascii |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
17 import collections |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
18 import contextlib |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
19 import io |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
20 import os |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
21 import struct |
50348
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
22 import weakref |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
23 import zlib |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
24 |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
25 # import stuff from node for others to import from revlog |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
26 from .node import ( |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
27 bin, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
28 hex, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
29 nullrev, |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
30 sha1nodeconstants, |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
31 short, |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
32 wdirrev, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
33 ) |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
34 from .i18n import _ |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
35 from .revlogutils.constants import ( |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
36 ALL_KINDS, |
47277
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47274
diff
changeset
|
37 CHANGELOGV2, |
47266
ff9fd7107d11
revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47265
diff
changeset
|
38 COMP_MODE_DEFAULT, |
47260
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
39 COMP_MODE_INLINE, |
47264
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
40 COMP_MODE_PLAIN, |
49791
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
41 DELTA_BASE_REUSE_NO, |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
42 DELTA_BASE_REUSE_TRY, |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
43 ENTRY_RANK, |
47242
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
44 FEATURES_BY_VERSION, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
45 FLAG_GENERALDELTA, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
46 FLAG_INLINE_DATA, |
46859
c6e23fb4bfb4
revlog: move the "index header" struct inside revlog.utils.constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46858
diff
changeset
|
47 INDEX_HEADER, |
47274
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
48 KIND_CHANGELOG, |
49712
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
49 KIND_FILELOG, |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
50 RANK_UNKNOWN, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
51 REVLOGV0, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
52 REVLOGV1, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
53 REVLOGV1_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
54 REVLOGV2, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
55 REVLOGV2_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
56 REVLOG_DEFAULT_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
57 REVLOG_DEFAULT_FORMAT, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
58 REVLOG_DEFAULT_VERSION, |
47241
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
59 SUPPORTED_FLAGS, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
60 ) |
42745
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
61 from .revlogutils.flagutil import ( |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
62 REVIDX_DEFAULT_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
63 REVIDX_ELLIPSIS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
64 REVIDX_EXTSTORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
65 REVIDX_FLAGS_ORDER, |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45054
diff
changeset
|
66 REVIDX_HASCOPIESINFO, |
42745
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
67 REVIDX_ISCENSORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
68 REVIDX_RAWTEXT_CHANGING_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
69 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
70 from .thirdparty import attr |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
71 from . import ( |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
72 ancestor, |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
73 dagop, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
74 error, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
75 mdiff, |
32411
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32355
diff
changeset
|
76 policy, |
31580
a8e55d6f1d67
revlog: use pycompat.maplist to eagerly evaluate map on Python 3
Augie Fackler <augie@google.com>
parents:
31511
diff
changeset
|
77 pycompat, |
47400
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
78 revlogutils, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
79 templatefilters, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
80 util, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
81 ) |
42823
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
82 from .interfaces import ( |
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
83 repository, |
42824
2c4f656c8e9f
interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42823
diff
changeset
|
84 util as interfaceutil, |
42823
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
85 ) |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
86 from .revlogutils import ( |
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
87 deltas as deltautil, |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
88 docket as docketutil, |
42746
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42745
diff
changeset
|
89 flagutil, |
44035
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44017
diff
changeset
|
90 nodemap as nodemaputil, |
47431
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47420
diff
changeset
|
91 randomaccessfile, |
47079
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
92 revlogv0, |
47470
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
93 rewrite, |
43037
142deb539ccf
sidedata: register the flag processors if the repository allows for it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43034
diff
changeset
|
94 sidedata as sidedatautil, |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
95 ) |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
96 from .utils import ( |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
97 storageutil, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
98 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
99 ) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
100 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
101 # blanked usage of all the name to prevent pyflakes constraints |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
102 # We need these name available in the module for extensions. |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
103 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
104 REVLOGV0 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
105 REVLOGV1 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
106 REVLOGV2 |
48772
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48768
diff
changeset
|
107 CHANGELOGV2 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
108 FLAG_INLINE_DATA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
109 FLAG_GENERALDELTA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
110 REVLOG_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
111 REVLOG_DEFAULT_FORMAT |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
112 REVLOG_DEFAULT_VERSION |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
113 REVLOGV1_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
114 REVLOGV2_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
115 REVIDX_ISCENSORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
116 REVIDX_ELLIPSIS |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45054
diff
changeset
|
117 REVIDX_HASCOPIESINFO |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
118 REVIDX_EXTSTORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
119 REVIDX_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
120 REVIDX_FLAGS_ORDER |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
121 REVIDX_RAWTEXT_CHANGING_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
122 |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
123 parsers = policy.importmod('parsers') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
124 rustancestor = policy.importrust('ancestor') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
125 rustdagop = policy.importrust('dagop') |
44017
8042856c90b6
rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents:
43984
diff
changeset
|
126 rustrevlog = policy.importrust('revlog') |
32411
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32355
diff
changeset
|
127 |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
128 # Aliased for performance. |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
129 _zlibdecompress = zlib.decompress |
5007
3addf4531643
revlog: localize some fastpath functions
Matt Mackall <mpm@selenic.com>
parents:
5006
diff
changeset
|
130 |
49923
9854a9adc466
revlog: fix misleading comment about _maxinline
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49877
diff
changeset
|
131 # max size of inline data embedded into a revlog |
10916
9c84395a338e
add documentation for revlog._prereadsize
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10914
diff
changeset
|
132 _maxinline = 131072 |
10913
f2ecc5733c89
revlog: factor out _maxinline global.
Greg Ward <greg-hg@gerg.ca>
parents:
10404
diff
changeset
|
133 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
134 # Flag processors for REVIDX_ELLIPSIS. |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
135 def ellipsisreadprocessor(rl, text): |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
136 return text, False |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
137 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
138 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
139 def ellipsiswriteprocessor(rl, text): |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
140 return text, False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
141 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
142 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
143 def ellipsisrawprocessor(rl, text): |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
144 return False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
145 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
146 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
147 ellipsisprocessor = ( |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
148 ellipsisreadprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
149 ellipsiswriteprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
150 ellipsisrawprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
151 ) |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
152 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
153 |
43962
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
154 def _verify_revision(rl, skipflags, state, node): |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
155 """Verify the integrity of the given revlog ``node`` while providing a hook |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
156 point for extensions to influence the operation.""" |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
157 if skipflags: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
158 state[b'skipread'].add(node) |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
159 else: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
160 # Side-effect: read content and verify hash. |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
161 rl.revision(node) |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
162 |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
163 |
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
|
164 # True if a fast implementation for persistent-nodemap is available |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
165 # |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
166 # We also consider we have a "fast" implementation in "pure" python because |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
167 # people using pure don't really have performance consideration (and a |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
168 # wheelbarrow of other slowness source) |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
169 HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or hasattr( |
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
|
170 parsers, 'BaseIndexObject' |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
171 ) |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
172 |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
173 |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
174 @interfaceutil.implementer(repository.irevisiondelta) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
175 @attr.s(slots=True) |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49019
diff
changeset
|
176 class revlogrevisiondelta: |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
177 node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
178 p1node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
179 p2node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
180 basenode = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
181 flags = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
182 baserevisionsize = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
183 revision = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
184 delta = attr.ib() |
46725
e8c11a2c96c0
delta: add sidedata field to revision delta
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46724
diff
changeset
|
185 sidedata = attr.ib() |
47094
119790e1c67c
cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47092
diff
changeset
|
186 protocol_flags = attr.ib() |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
187 linknode = attr.ib(default=None) |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
188 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
189 |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
190 @interfaceutil.implementer(repository.iverifyproblem) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
191 @attr.s(frozen=True) |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49019
diff
changeset
|
192 class revlogproblem: |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
193 warning = attr.ib(default=None) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
194 error = attr.ib(default=None) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
195 node = attr.ib(default=None) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
196 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
197 |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
198 def parse_index_v1(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
199 # call the C implementation to parse the index data |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
200 index, cache = parsers.parse_index2(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
201 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
202 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
203 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
204 def parse_index_v2(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
205 # call the C implementation to parse the index data |
48772
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48768
diff
changeset
|
206 index, cache = parsers.parse_index2(data, inline, format=REVLOGV2) |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
207 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
208 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
209 |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
210 def parse_index_cl_v2(data, inline): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
211 # call the C implementation to parse the index data |
48772
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48768
diff
changeset
|
212 index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2) |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
213 return index, cache |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
214 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
215 |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
216 if hasattr(parsers, 'parse_index_devel_nodemap'): |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
217 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
218 def parse_index_v1_nodemap(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
219 index, cache = parsers.parse_index_devel_nodemap(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
220 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
221 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
222 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
223 else: |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
224 parse_index_v1_nodemap = None |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
225 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
226 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
227 def parse_index_v1_mixed(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
228 index, cache = parse_index_v1(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
229 return rustrevlog.MixedIndex(index), cache |
4972
8d0cf46e0dc6
revlog: add revlogio interface
Matt Mackall <mpm@selenic.com>
parents:
4971
diff
changeset
|
230 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
231 |
25410
eee88912db0a
revlog: raise an exception earlier if an entry is too large (issue4675)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
25361
diff
changeset
|
232 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte |
eee88912db0a
revlog: raise an exception earlier if an entry is too large (issue4675)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
25361
diff
changeset
|
233 # signed integer) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
234 _maxentrysize = 0x7FFFFFFF |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
235 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
236 FILE_TOO_SHORT_MSG = _( |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
237 b'cannot read from revlog %s;' |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
238 b' expected %d bytes from offset %d, data size is %d' |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
239 ) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
240 |
49448
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
241 hexdigits = b'0123456789abcdefABCDEF' |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
242 |
25410
eee88912db0a
revlog: raise an exception earlier if an entry is too large (issue4675)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
25361
diff
changeset
|
243 |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
244 class _Config: |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
245 def copy(self): |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
246 return self.__class__(**self.__dict__) |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
247 |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
248 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
249 @attr.s() |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
250 class FeatureConfig(_Config): |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
251 """Hold configuration values about the available revlog features""" |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
252 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
253 # the default compression engine |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
254 compression_engine = attr.ib(default=b'zlib') |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
255 # compression engines options |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
256 compression_engine_options = attr.ib(default=attr.Factory(dict)) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
257 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
258 # can we use censor on this revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
259 censorable = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
260 # does this revlog use the "side data" feature |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
261 has_side_data = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
262 # might remove rank configuration once the computation has no impact |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
263 compute_rank = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
264 # parent order is supposed to be semantically irrelevant, so we |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
265 # normally resort parents to ensure that the first parent is non-null, |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
266 # if there is a non-null parent at all. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
267 # filelog abuses the parent order as flag to mark some instances of |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
268 # meta-encoded files, so allow it to disable this behavior. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
269 canonical_parent_order = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
270 # can ellipsis commit be used |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
271 enable_ellipsis = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
272 |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
273 def copy(self): |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
274 new = super().copy() |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
275 new.compression_engine_options = self.compression_engine_options.copy() |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
276 return new |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
277 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
278 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
279 @attr.s() |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
280 class DataConfig(_Config): |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
281 """Hold configuration value about how the revlog data are read""" |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
282 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
283 # should we try to open the "pending" version of the revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
284 try_pending = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
285 # should we try to open the "splitted" version of the revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
286 try_split = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
287 # When True, indexfile should be opened with checkambig=True at writing, |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
288 # to avoid file stat ambiguity. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
289 check_ambig = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
290 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
291 # If true, use mmap instead of reading to deal with large index |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
292 mmap_large_index = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
293 # how much data is large |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
294 mmap_index_threshold = attr.ib(default=None) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
295 # How much data to read and cache into the raw revlog data cache. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
296 chunk_cache_size = attr.ib(default=65536) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
297 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
298 # The size of the uncompressed cache compared to the largest revision seen. |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
299 uncompressed_cache_factor = attr.ib(default=None) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
300 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
301 # The number of chunk cached |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
302 uncompressed_cache_count = attr.ib(default=None) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
303 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
304 # Allow sparse reading of the revlog data |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
305 with_sparse_read = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
306 # minimal density of a sparse read chunk |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
307 sr_density_threshold = attr.ib(default=0.50) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
308 # minimal size of data we skip when performing sparse read |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
309 sr_min_gap_size = attr.ib(default=262144) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
310 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
311 # are delta encoded against arbitrary bases. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
312 generaldelta = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
313 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
314 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
315 @attr.s() |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
316 class DeltaConfig(_Config): |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
317 """Hold configuration value about how new delta are computed |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
318 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
319 Some attributes are duplicated from DataConfig to help havign each object |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
320 self contained. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
321 """ |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
322 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
323 # can delta be encoded against arbitrary bases. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
324 general_delta = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
325 # Allow sparse writing of the revlog data |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
326 sparse_revlog = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
327 # maximum length of a delta chain |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
328 max_chain_len = attr.ib(default=None) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
329 # Maximum distance between delta chain base start and end |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
330 max_deltachain_span = attr.ib(default=-1) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
331 # If `upper_bound_comp` is not None, this is the expected maximal gain from |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
332 # compression for the data content. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
333 upper_bound_comp = attr.ib(default=None) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
334 # Should we try a delta against both parent |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
335 delta_both_parents = attr.ib(default=True) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
336 # Test delta base candidate group by chunk of this maximal size. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
337 candidate_group_chunk_size = attr.ib(default=0) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
338 # Should we display debug information about delta computation |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
339 debug_delta = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
340 # trust incoming delta by default |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
341 lazy_delta = attr.ib(default=True) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
342 # trust the base of incoming delta by default |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
343 lazy_delta_base = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
344 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
345 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
346 class _InnerRevlog: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
347 """An inner layer of the revlog object |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
348 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
349 That layer exist to be able to delegate some operation to Rust, its |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
350 boundaries are arbitrary and based on what we can delegate to Rust. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
351 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
352 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
353 def __init__( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
354 self, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
355 opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
356 index, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
357 index_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
358 data_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
359 sidedata_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
360 inline, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
361 data_config, |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
362 delta_config, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
363 feature_config, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
364 chunk_cache, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
365 default_compression_header, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
366 ): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
367 self.opener = opener |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
368 self.index = index |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
369 |
51093
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
370 self.__index_file = index_file |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
371 self.data_file = data_file |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
372 self.sidedata_file = sidedata_file |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
373 self.inline = inline |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
374 self.data_config = data_config |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
375 self.delta_config = delta_config |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
376 self.feature_config = feature_config |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
377 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
378 # used during diverted write. |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
379 self._orig_index_file = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
380 |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
381 self._default_compression_header = default_compression_header |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
382 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
383 # index |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
384 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
385 # 3-tuple of file handles being used for active writing. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
386 self._writinghandles = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
387 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
388 self._segmentfile = randomaccessfile.randomaccessfile( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
389 self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
390 (self.index_file if self.inline else self.data_file), |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
391 self.data_config.chunk_cache_size, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
392 chunk_cache, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
393 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
394 self._segmentfile_sidedata = randomaccessfile.randomaccessfile( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
395 self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
396 self.sidedata_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
397 self.data_config.chunk_cache_size, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
398 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
399 |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
400 # revlog header -> revlog compressor |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
401 self._decompressors = {} |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
402 # 3-tuple of (node, rev, text) for a raw revision. |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
403 self._revisioncache = None |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
404 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
405 # cache some uncompressed chunks |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
406 # rev → uncompressed_chunk |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
407 # |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
408 # the max cost is dynamically updated to be proportionnal to the |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
409 # size of revision we actually encounter. |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
410 self._uncompressed_chunk_cache = None |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
411 if self.data_config.uncompressed_cache_factor is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
412 self._uncompressed_chunk_cache = util.lrucachedict( |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
413 self.data_config.uncompressed_cache_count, |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
414 maxcost=65536, # some arbitrary initial value |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
415 ) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
416 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
417 self._delay_buffer = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
418 |
51093
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
419 @property |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
420 def index_file(self): |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
421 return self.__index_file |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
422 |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
423 @index_file.setter |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
424 def index_file(self, new_index_file): |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
425 self.__index_file = new_index_file |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
426 if self.inline: |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
427 self._segmentfile.filename = new_index_file |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
428 |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
429 def __len__(self): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
430 return len(self.index) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
431 |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
432 def clear_cache(self): |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
433 assert not self.is_delaying |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
434 self._revisioncache = None |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
435 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
436 self._uncompressed_chunk_cache.clear() |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
437 self._segmentfile.clear_cache() |
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
438 self._segmentfile_sidedata.clear_cache() |
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
439 |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
440 @property |
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
441 def canonical_index_file(self): |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
442 if self._orig_index_file is not None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
443 return self._orig_index_file |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
444 return self.index_file |
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
445 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
446 @property |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
447 def is_delaying(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
448 """is the revlog is currently delaying the visibility of written data? |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
449 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
450 The delaying mechanism can be either in-memory or written on disk in a |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
451 side-file.""" |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
452 return (self._delay_buffer is not None) or ( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
453 self._orig_index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
454 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
455 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
456 # Derived from index values. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
457 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
458 def start(self, rev): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
459 """the offset of the data chunk for this revision""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
460 return int(self.index[rev][0] >> 16) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
461 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
462 def length(self, rev): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
463 """the length of the data chunk for this revision""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
464 return self.index[rev][1] |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
465 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
466 def end(self, rev): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
467 """the end of the data chunk for this revision""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
468 return self.start(rev) + self.length(rev) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
469 |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
470 def deltaparent(self, rev): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
471 """return deltaparent of the given revision""" |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
472 base = self.index[rev][3] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
473 if base == rev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
474 return nullrev |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
475 elif self.delta_config.general_delta: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
476 return base |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
477 else: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
478 return rev - 1 |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
479 |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
480 def issnapshot(self, rev): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
481 """tells whether rev is a snapshot""" |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
482 if not self.delta_config.sparse_revlog: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
483 return self.deltaparent(rev) == nullrev |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
484 elif hasattr(self.index, 'issnapshot'): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
485 # directly assign the method to cache the testing and access |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
486 self.issnapshot = self.index.issnapshot |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
487 return self.issnapshot(rev) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
488 if rev == nullrev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
489 return True |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
490 entry = self.index[rev] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
491 base = entry[3] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
492 if base == rev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
493 return True |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
494 if base == nullrev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
495 return True |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
496 p1 = entry[5] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
497 while self.length(p1) == 0: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
498 b = self.deltaparent(p1) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
499 if b == p1: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
500 break |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
501 p1 = b |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
502 p2 = entry[6] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
503 while self.length(p2) == 0: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
504 b = self.deltaparent(p2) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
505 if b == p2: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
506 break |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
507 p2 = b |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
508 if base == p1 or base == p2: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
509 return False |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
510 return self.issnapshot(base) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
511 |
51099
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
512 def _deltachain(self, rev, stoprev=None): |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
513 """Obtain the delta chain for a revision. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
514 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
515 ``stoprev`` specifies a revision to stop at. If not specified, we |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
516 stop at the base of the chain. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
517 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
518 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
519 revs in ascending order and ``stopped`` is a bool indicating whether |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
520 ``stoprev`` was hit. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
521 """ |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
522 generaldelta = self.delta_config.general_delta |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
523 # Try C implementation. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
524 try: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
525 return self.index.deltachain(rev, stoprev, generaldelta) |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
526 except AttributeError: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
527 pass |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
528 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
529 chain = [] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
530 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
531 # Alias to prevent attribute lookup in tight loop. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
532 index = self.index |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
533 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
534 iterrev = rev |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
535 e = index[iterrev] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
536 while iterrev != e[3] and iterrev != stoprev: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
537 chain.append(iterrev) |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
538 if generaldelta: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
539 iterrev = e[3] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
540 else: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
541 iterrev -= 1 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
542 e = index[iterrev] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
543 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
544 if iterrev == stoprev: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
545 stopped = True |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
546 else: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
547 chain.append(iterrev) |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
548 stopped = False |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
549 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
550 chain.reverse() |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
551 return chain, stopped |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
552 |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
553 @util.propertycache |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
554 def _compressor(self): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
555 engine = util.compengines[self.feature_config.compression_engine] |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
556 return engine.revlogcompressor( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
557 self.feature_config.compression_engine_options |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
558 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
559 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
560 @util.propertycache |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
561 def _decompressor(self): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
562 """the default decompressor""" |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
563 if self._default_compression_header is None: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
564 return None |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
565 t = self._default_compression_header |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
566 c = self._get_decompressor(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
567 return c.decompress |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
568 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
569 def _get_decompressor(self, t): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
570 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
571 compressor = self._decompressors[t] |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
572 except KeyError: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
573 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
574 engine = util.compengines.forrevlogheader(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
575 compressor = engine.revlogcompressor( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
576 self.feature_config.compression_engine_options |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
577 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
578 self._decompressors[t] = compressor |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
579 except KeyError: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
580 raise error.RevlogError( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
581 _(b'unknown compression type %s') % binascii.hexlify(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
582 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
583 return compressor |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
584 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
585 def compress(self, data): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
586 """Generate a possibly-compressed representation of data.""" |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
587 if not data: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
588 return b'', data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
589 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
590 compressed = self._compressor.compress(data) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
591 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
592 if compressed: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
593 # The revlog compressor added the header in the returned data. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
594 return b'', compressed |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
595 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
596 if data[0:1] == b'\0': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
597 return b'', data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
598 return b'u', data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
599 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
600 def decompress(self, data): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
601 """Decompress a revlog chunk. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
602 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
603 The chunk is expected to begin with a header identifying the |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
604 format type so it can be routed to an appropriate decompressor. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
605 """ |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
606 if not data: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
607 return data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
608 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
609 # Revlogs are read much more frequently than they are written and many |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
610 # chunks only take microseconds to decompress, so performance is |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
611 # important here. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
612 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
613 # We can make a few assumptions about revlogs: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
614 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
615 # 1) the majority of chunks will be compressed (as opposed to inline |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
616 # raw data). |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
617 # 2) decompressing *any* data will likely by at least 10x slower than |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
618 # returning raw inline data. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
619 # 3) we want to prioritize common and officially supported compression |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
620 # engines |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
621 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
622 # It follows that we want to optimize for "decompress compressed data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
623 # when encoded with common and officially supported compression engines" |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
624 # case over "raw data" and "data encoded by less common or non-official |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
625 # compression engines." That is why we have the inline lookup first |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
626 # followed by the compengines lookup. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
627 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
628 # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
629 # compressed chunks. And this matters for changelog and manifest reads. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
630 t = data[0:1] |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
631 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
632 if t == b'x': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
633 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
634 return _zlibdecompress(data) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
635 except zlib.error as e: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
636 raise error.RevlogError( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
637 _(b'revlog decompress error: %s') |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
638 % stringutil.forcebytestr(e) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
639 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
640 # '\0' is more common than 'u' so it goes first. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
641 elif t == b'\0': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
642 return data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
643 elif t == b'u': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
644 return util.buffer(data, 1) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
645 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
646 compressor = self._get_decompressor(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
647 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
648 return compressor.decompress(data) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
649 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
650 @contextlib.contextmanager |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
651 def reading(self): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
652 """Context manager that keeps data and sidedata files open for reading""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
653 if len(self.index) == 0: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
654 yield # nothing to be read |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
655 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
656 with self._segmentfile.reading(): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
657 with self._segmentfile_sidedata.reading(): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
658 yield |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
659 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
660 @property |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
661 def is_writing(self): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
662 """True is a writing context is open""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
663 return self._writinghandles is not None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
664 |
51106
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
665 @property |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
666 def is_open(self): |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
667 """True if any file handle is being held |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
668 |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
669 Used for assert and debug in the python code""" |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
670 return self._segmentfile.is_open or self._segmentfile_sidedata.is_open |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
671 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
672 @contextlib.contextmanager |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
673 def writing(self, transaction, data_end=None, sidedata_end=None): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
674 """Open the revlog files for writing |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
675 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
676 Add content to a revlog should be done within such context. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
677 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
678 if self.is_writing: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
679 yield |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
680 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
681 ifh = dfh = sdfh = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
682 try: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
683 r = len(self.index) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
684 # opening the data file. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
685 dsize = 0 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
686 if r: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
687 dsize = self.end(r - 1) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
688 dfh = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
689 if not self.inline: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
690 try: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
691 dfh = self.opener(self.data_file, mode=b"r+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
692 if data_end is None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
693 dfh.seek(0, os.SEEK_END) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
694 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
695 dfh.seek(data_end, os.SEEK_SET) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
696 except FileNotFoundError: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
697 dfh = self.opener(self.data_file, mode=b"w+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
698 transaction.add(self.data_file, dsize) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
699 if self.sidedata_file is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
700 assert sidedata_end is not None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
701 # revlog-v2 does not inline, help Pytype |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
702 assert dfh is not None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
703 try: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
704 sdfh = self.opener(self.sidedata_file, mode=b"r+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
705 dfh.seek(sidedata_end, os.SEEK_SET) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
706 except FileNotFoundError: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
707 sdfh = self.opener(self.sidedata_file, mode=b"w+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
708 transaction.add(self.sidedata_file, sidedata_end) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
709 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
710 # opening the index file. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
711 isize = r * self.index.entry_size |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
712 ifh = self.__index_write_fp() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
713 if self.inline: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
714 transaction.add(self.index_file, dsize + isize) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
715 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
716 transaction.add(self.index_file, isize) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
717 # exposing all file handle for writing. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
718 self._writinghandles = (ifh, dfh, sdfh) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
719 self._segmentfile.writing_handle = ifh if self.inline else dfh |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
720 self._segmentfile_sidedata.writing_handle = sdfh |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
721 yield |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
722 finally: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
723 self._writinghandles = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
724 self._segmentfile.writing_handle = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
725 self._segmentfile_sidedata.writing_handle = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
726 if dfh is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
727 dfh.close() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
728 if sdfh is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
729 sdfh.close() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
730 # closing the index file last to avoid exposing referent to |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
731 # potential unflushed data content. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
732 if ifh is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
733 ifh.close() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
734 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
735 def __index_write_fp(self, index_end=None): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
736 """internal method to open the index file for writing |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
737 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
738 You should not use this directly and use `_writing` instead |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
739 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
740 try: |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
741 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
742 f = self.opener( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
743 self.index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
744 mode=b"r+", |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
745 checkambig=self.data_config.check_ambig, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
746 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
747 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
748 # check_ambig affect we way we open file for writing, however |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
749 # here, we do not actually open a file for writting as write |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
750 # will appened to a delay_buffer. So check_ambig is not |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
751 # meaningful and unneeded here. |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
752 f = randomaccessfile.appender( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
753 self.opener, self.index_file, b"r+", self._delay_buffer |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
754 ) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
755 if index_end is None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
756 f.seek(0, os.SEEK_END) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
757 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
758 f.seek(index_end, os.SEEK_SET) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
759 return f |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
760 except FileNotFoundError: |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
761 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
762 return self.opener( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
763 self.index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
764 mode=b"w+", |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
765 checkambig=self.data_config.check_ambig, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
766 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
767 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
768 return randomaccessfile.appender( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
769 self.opener, self.index_file, b"w+", self._delay_buffer |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
770 ) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
771 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
772 def __index_new_fp(self): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
773 """internal method to create a new index file for writing |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
774 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
775 You should not use this unless you are upgrading from inline revlog |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
776 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
777 return self.opener( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
778 self.index_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
779 mode=b"w", |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
780 checkambig=self.data_config.check_ambig, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
781 atomictemp=True, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
782 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
783 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
784 def split_inline(self, tr, header, new_index_file_path=None): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
785 """split the data of an inline revlog into an index and a data file""" |
51141
962974a5d068
revlog: add one more assert about state of thing when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51139
diff
changeset
|
786 assert self._delay_buffer is None |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
787 existing_handles = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
788 if self._writinghandles is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
789 existing_handles = True |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
790 fp = self._writinghandles[0] |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
791 fp.flush() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
792 fp.close() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
793 # We can't use the cached file handle after close(). So prevent |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
794 # its usage. |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
795 self._writinghandles = None |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
796 self._segmentfile.writing_handle = None |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
797 # No need to deal with sidedata writing handle as it is only |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
798 # relevant with revlog-v2 which is never inline, not reaching |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
799 # this code |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
800 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
801 new_dfh = self.opener(self.data_file, mode=b"w+") |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
802 new_dfh.truncate(0) # drop any potentially existing data |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
803 try: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
804 with self.reading(): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
805 for r in range(len(self.index)): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
806 new_dfh.write(self.get_segment_for_revs(r, r)[1]) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
807 new_dfh.flush() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
808 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
809 if new_index_file_path is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
810 self.index_file = new_index_file_path |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
811 with self.__index_new_fp() as fp: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
812 self.inline = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
813 for i in range(len(self.index)): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
814 e = self.index.entry_binary(i) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
815 if i == 0: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
816 packed_header = self.index.pack_header(header) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
817 e = packed_header + e |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
818 fp.write(e) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
819 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
820 # If we don't use side-write, the temp file replace the real |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
821 # index when we exit the context manager |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
822 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
823 self._segmentfile = randomaccessfile.randomaccessfile( |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
824 self.opener, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
825 self.data_file, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
826 self.data_config.chunk_cache_size, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
827 ) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
828 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
829 if existing_handles: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
830 # switched from inline to conventional reopen the index |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
831 ifh = self.__index_write_fp() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
832 self._writinghandles = (ifh, new_dfh, None) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
833 self._segmentfile.writing_handle = new_dfh |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
834 new_dfh = None |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
835 # No need to deal with sidedata writing handle as it is only |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
836 # relevant with revlog-v2 which is never inline, not reaching |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
837 # this code |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
838 finally: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
839 if new_dfh is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
840 new_dfh.close() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
841 return self.index_file |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
842 |
51091
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
843 def get_segment_for_revs(self, startrev, endrev): |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
844 """Obtain a segment of raw data corresponding to a range of revisions. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
845 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
846 Accepts the start and end revisions and an optional already-open |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
847 file handle to be used for reading. If the file handle is read, its |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
848 seek position will not be preserved. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
849 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
850 Requests for data may be satisfied by a cache. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
851 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
852 Returns a 2-tuple of (offset, data) for the requested range of |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
853 revisions. Offset is the integer offset from the beginning of the |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
854 revlog and data is a str or buffer of the raw byte data. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
855 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
856 Callers will need to call ``self.start(rev)`` and ``self.length(rev)`` |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
857 to determine where each revision's data begins and ends. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
858 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
859 API: we should consider making this a private part of the InnerRevlog |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
860 at some point. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
861 """ |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
862 # Inlined self.start(startrev) & self.end(endrev) for perf reasons |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
863 # (functions are expensive). |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
864 index = self.index |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
865 istart = index[startrev] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
866 start = int(istart[0] >> 16) |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
867 if startrev == endrev: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
868 end = start + istart[1] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
869 else: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
870 iend = index[endrev] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
871 end = int(iend[0] >> 16) + iend[1] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
872 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
873 if self.inline: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
874 start += (startrev + 1) * self.index.entry_size |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
875 end += (endrev + 1) * self.index.entry_size |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
876 length = end - start |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
877 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
878 return start, self._segmentfile.read_chunk(start, length) |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
879 |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
880 def _chunk(self, rev): |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
881 """Obtain a single decompressed chunk for a revision. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
882 |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
883 Accepts an integer revision and an optional already-open file handle |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
884 to be used for reading. If used, the seek position of the file will not |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
885 be preserved. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
886 |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
887 Returns a str holding uncompressed data for the requested revision. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
888 """ |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
889 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
890 uncomp = self._uncompressed_chunk_cache.get(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
891 if uncomp is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
892 return uncomp |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
893 |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
894 compression_mode = self.index[rev][10] |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
895 data = self.get_segment_for_revs(rev, rev)[1] |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
896 if compression_mode == COMP_MODE_PLAIN: |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
897 uncomp = data |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
898 elif compression_mode == COMP_MODE_DEFAULT: |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
899 uncomp = self._decompressor(data) |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
900 elif compression_mode == COMP_MODE_INLINE: |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
901 uncomp = self.decompress(data) |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
902 else: |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
903 msg = b'unknown compression mode %d' |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
904 msg %= compression_mode |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
905 raise error.RevlogError(msg) |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
906 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
907 self._uncompressed_chunk_cache.insert(rev, uncomp, cost=len(uncomp)) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
908 return uncomp |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
909 |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
910 def _chunks(self, revs, targetsize=None): |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
911 """Obtain decompressed chunks for the specified revisions. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
912 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
913 Accepts an iterable of numeric revisions that are assumed to be in |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
914 ascending order. Also accepts an optional already-open file handle |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
915 to be used for reading. If used, the seek position of the file will |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
916 not be preserved. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
917 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
918 This function is similar to calling ``self._chunk()`` multiple times, |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
919 but is faster. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
920 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
921 Returns a list with decompressed data for each requested revision. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
922 """ |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
923 if not revs: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
924 return [] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
925 start = self.start |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
926 length = self.length |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
927 inline = self.inline |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
928 iosize = self.index.entry_size |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
929 buffer = util.buffer |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
930 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
931 fetched_revs = [] |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
932 fadd = fetched_revs.append |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
933 |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
934 chunks = [] |
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
935 ladd = chunks.append |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
936 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
937 if self._uncompressed_chunk_cache is None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
938 fetched_revs = revs |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
939 else: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
940 for rev in revs: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
941 cached_value = self._uncompressed_chunk_cache.get(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
942 if cached_value is None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
943 fadd(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
944 else: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
945 ladd((rev, cached_value)) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
946 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
947 if not fetched_revs: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
948 slicedchunks = () |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
949 elif not self.data_config.with_sparse_read: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
950 slicedchunks = (fetched_revs,) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
951 else: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
952 slicedchunks = deltautil.slicechunk( |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
953 self, |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
954 fetched_revs, |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
955 targetsize=targetsize, |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
956 ) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
957 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
958 for revschunk in slicedchunks: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
959 firstrev = revschunk[0] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
960 # Skip trailing revisions with empty diff |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
961 for lastrev in revschunk[::-1]: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
962 if length(lastrev) != 0: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
963 break |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
964 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
965 try: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
966 offset, data = self.get_segment_for_revs(firstrev, lastrev) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
967 except OverflowError: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
968 # issue4215 - we can't cache a run of chunks greater than |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
969 # 2G on Windows |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
970 for rev in revschunk: |
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
971 ladd((rev, self._chunk(rev))) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
972 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
973 decomp = self.decompress |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
974 # self._decompressor might be None, but will not be used in that case |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
975 def_decomp = self._decompressor |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
976 for rev in revschunk: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
977 chunkstart = start(rev) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
978 if inline: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
979 chunkstart += (rev + 1) * iosize |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
980 chunklength = length(rev) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
981 comp_mode = self.index[rev][10] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
982 c = buffer(data, chunkstart - offset, chunklength) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
983 if comp_mode == COMP_MODE_PLAIN: |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
984 c = c |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
985 elif comp_mode == COMP_MODE_INLINE: |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
986 c = decomp(c) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
987 elif comp_mode == COMP_MODE_DEFAULT: |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
988 c = def_decomp(c) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
989 else: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
990 msg = b'unknown compression mode %d' |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
991 msg %= comp_mode |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
992 raise error.RevlogError(msg) |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
993 ladd((rev, c)) |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
994 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
995 self._uncompressed_chunk_cache.insert(rev, c, len(c)) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
996 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
997 chunks.sort() |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
998 return [x[1] for x in chunks] |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
999 |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1000 def raw_text(self, node, rev): |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1001 """return the possibly unvalidated rawtext for a revision |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1002 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1003 returns (rev, rawtext, validated) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1004 """ |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1005 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1006 # revision in the cache (could be useful to apply delta) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1007 cachedrev = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1008 # An intermediate text to apply deltas to |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1009 basetext = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1010 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1011 # Check if we have the entry in cache |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1012 # The cache entry looks like (node, rev, rawtext) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1013 if self._revisioncache: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1014 cachedrev = self._revisioncache[1] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1015 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1016 chain, stopped = self._deltachain(rev, stoprev=cachedrev) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1017 if stopped: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1018 basetext = self._revisioncache[2] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1019 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1020 # drop cache to save memory, the caller is expected to |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1021 # update self._inner._revisioncache after validating the text |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1022 self._revisioncache = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1023 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1024 targetsize = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1025 rawsize = self.index[rev][2] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1026 if 0 <= rawsize: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1027 targetsize = 4 * rawsize |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1028 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1029 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1030 # dynamically update the uncompressed_chunk_cache size to the |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1031 # largest revision we saw in this revlog. |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1032 factor = self.data_config.uncompressed_cache_factor |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1033 candidate_size = rawsize * factor |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1034 if candidate_size > self._uncompressed_chunk_cache.maxcost: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1035 self._uncompressed_chunk_cache.maxcost = candidate_size |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1036 |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1037 bins = self._chunks(chain, targetsize=targetsize) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1038 if basetext is None: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1039 basetext = bytes(bins[0]) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1040 bins = bins[1:] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1041 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1042 rawtext = mdiff.patches(basetext, bins) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1043 del basetext # let us have a chance to free memory early |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1044 return (rev, rawtext, False) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1045 |
51102
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1046 def sidedata(self, rev, sidedata_end): |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1047 """Return the sidedata for a given revision number.""" |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1048 index_entry = self.index[rev] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1049 sidedata_offset = index_entry[8] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1050 sidedata_size = index_entry[9] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1051 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1052 if self.inline: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1053 sidedata_offset += self.index.entry_size * (1 + rev) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1054 if sidedata_size == 0: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1055 return {} |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1056 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1057 if sidedata_end < sidedata_offset + sidedata_size: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1058 filename = self.sidedata_file |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1059 end = sidedata_end |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1060 offset = sidedata_offset |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1061 length = sidedata_size |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1062 m = FILE_TOO_SHORT_MSG % (filename, length, offset, end) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1063 raise error.RevlogError(m) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1064 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1065 comp_segment = self._segmentfile_sidedata.read_chunk( |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1066 sidedata_offset, sidedata_size |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1067 ) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1068 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1069 comp = self.index[rev][11] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1070 if comp == COMP_MODE_PLAIN: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1071 segment = comp_segment |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1072 elif comp == COMP_MODE_DEFAULT: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1073 segment = self._decompressor(comp_segment) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1074 elif comp == COMP_MODE_INLINE: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1075 segment = self.decompress(comp_segment) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1076 else: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1077 msg = b'unknown compression mode %d' |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1078 msg %= comp |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1079 raise error.RevlogError(msg) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1080 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1081 sidedata = sidedatautil.deserialize_sidedata(segment) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1082 return sidedata |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1083 |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1084 def write_entry( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1085 self, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1086 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1087 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1088 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1089 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1090 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1091 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1092 sidedata_offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1093 index_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1094 data_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1095 sidedata_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1096 ): |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1097 # Files opened in a+ mode have inconsistent behavior on various |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1098 # platforms. Windows requires that a file positioning call be made |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1099 # when the file handle transitions between reads and writes. See |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1100 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1101 # platforms, Python or the platform itself can be buggy. Some versions |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1102 # of Solaris have been observed to not append at the end of the file |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1103 # if the file was seeked to before the end. See issue4943 for more. |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1104 # |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1105 # We work around this issue by inserting a seek() before writing. |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1106 # Note: This is likely not necessary on Python 3. However, because |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1107 # the file handle is reused for reads and may be seeked there, we need |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1108 # to be careful before changing this. |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1109 if self._writinghandles is None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1110 msg = b'adding revision outside `revlog._writing` context' |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1111 raise error.ProgrammingError(msg) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1112 ifh, dfh, sdfh = self._writinghandles |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1113 if index_end is None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1114 ifh.seek(0, os.SEEK_END) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1115 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1116 ifh.seek(index_end, os.SEEK_SET) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1117 if dfh: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1118 if data_end is None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1119 dfh.seek(0, os.SEEK_END) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1120 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1121 dfh.seek(data_end, os.SEEK_SET) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1122 if sdfh: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1123 sdfh.seek(sidedata_end, os.SEEK_SET) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1124 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1125 curr = len(self.index) - 1 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1126 if not self.inline: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1127 transaction.add(self.data_file, offset) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1128 if self.sidedata_file: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1129 transaction.add(self.sidedata_file, sidedata_offset) |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
1130 transaction.add(self.canonical_index_file, curr * len(entry)) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1131 if data[0]: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1132 dfh.write(data[0]) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1133 dfh.write(data[1]) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1134 if sidedata: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1135 sdfh.write(sidedata) |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1136 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1137 ifh.write(entry) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1138 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1139 self._delay_buffer.append(entry) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1140 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1141 offset += curr * self.index.entry_size |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
1142 transaction.add(self.canonical_index_file, offset) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1143 assert not sidedata |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1144 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1145 ifh.write(entry) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1146 ifh.write(data[0]) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1147 ifh.write(data[1]) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1148 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1149 self._delay_buffer.append(entry) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1150 self._delay_buffer.append(data[0]) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1151 self._delay_buffer.append(data[1]) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1152 return ( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1153 ifh.tell(), |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1154 dfh.tell() if dfh else None, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1155 sdfh.tell() if sdfh else None, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1156 ) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1157 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1158 def _divert_index(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1159 return self.index_file + b'.a' |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1160 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1161 def delay(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1162 assert not self.is_open |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1163 if self._delay_buffer is not None or self._orig_index_file is not None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1164 # delay or divert already in place |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1165 return None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1166 elif len(self.index) == 0: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1167 self._orig_index_file = self.index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1168 self.index_file = self._divert_index() |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1169 assert self._orig_index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1170 assert self.index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1171 if self.opener.exists(self.index_file): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1172 self.opener.unlink(self.index_file) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1173 return self.index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1174 else: |
51142
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1175 self._delay_buffer = [] |
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1176 if self.inline: |
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1177 self._segmentfile._delay_buffer = self._delay_buffer |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1178 return None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1179 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1180 def write_pending(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1181 assert not self.is_open |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1182 if self._orig_index_file is not None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1183 return None, True |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1184 any_pending = False |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1185 pending_index_file = self._divert_index() |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1186 if self.opener.exists(pending_index_file): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1187 self.opener.unlink(pending_index_file) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1188 util.copyfile( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1189 self.opener.join(self.index_file), |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1190 self.opener.join(pending_index_file), |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1191 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1192 if self._delay_buffer: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1193 with self.opener(pending_index_file, b'r+') as ifh: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1194 ifh.seek(0, os.SEEK_END) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1195 ifh.write(b"".join(self._delay_buffer)) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1196 any_pending = True |
51142
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1197 self._delay_buffer = None |
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1198 if self.inline: |
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1199 self._segmentfile._delay_buffer = self._delay_buffer |
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1200 else: |
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1201 assert self._segmentfile._delay_buffer is None |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1202 self._orig_index_file = self.index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1203 self.index_file = pending_index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1204 return self.index_file, any_pending |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1205 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1206 def finalize_pending(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1207 assert not self.is_open |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1208 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1209 delay = self._delay_buffer is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1210 divert = self._orig_index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1211 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1212 if delay and divert: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1213 assert False, "unreachable" |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1214 elif delay: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1215 if self._delay_buffer: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1216 with self.opener(self.index_file, b'r+') as ifh: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1217 ifh.seek(0, os.SEEK_END) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1218 ifh.write(b"".join(self._delay_buffer)) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1219 self._segmentfile._delay_buffer = self._delay_buffer = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1220 elif divert: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1221 if self.opener.exists(self.index_file): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1222 self.opener.rename( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1223 self.index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1224 self._orig_index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1225 checkambig=True, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1226 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1227 self.index_file = self._orig_index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1228 self._orig_index_file = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1229 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1230 msg = b"not delay or divert found on this revlog" |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1231 raise error.ProgrammingError(msg) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1232 return self.canonical_index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1233 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1234 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49019
diff
changeset
|
1235 class revlog: |
1083 | 1236 """ |
1237 the underlying revision storage object | |
1238 | |
1239 A revlog consists of two parts, an index and the revision data. | |
1240 | |
1241 The index is a file with a fixed record size containing | |
6912 | 1242 information on each revision, including its nodeid (hash), the |
1083 | 1243 nodeids of its parents, the position and offset of its data within |
1244 the data file, and the revision it's based on. Finally, each entry | |
1245 contains a linkrev entry that can serve as a pointer to external | |
1246 data. | |
1247 | |
1248 The revision data itself is a linear collection of data chunks. | |
1249 Each chunk represents a revision and is usually represented as a | |
1250 delta against the previous chunk. To bound lookup time, runs of | |
1251 deltas are limited to about 2 times the length of the original | |
1252 version data. This makes retrieval of a version proportional to | |
1253 its size, or O(1) relative to the number of revisions. | |
1254 | |
1255 Both pieces of the revlog are written to in an append-only | |
1256 fashion, which means we never need to rewrite a file to insert or | |
1257 remove data, and can use some simple techniques to avoid the need | |
1258 for locking while reading. | |
30001
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
1259 |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
1260 If checkambig, indexfile is opened with checkambig=True at |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
1261 writing, to avoid file stat ambiguity. |
34303
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1262 |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1263 If mmaplargeindex is True, and an mmapindexthreshold is set, the |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1264 index will be mmapped rather than read if it is larger than the |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1265 configured threshold. |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1266 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1267 If censorable is True, the revlog can have censored revisions. |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1268 |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1269 If `upperboundcomp` is not None, this is the expected maximal gain from |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1270 compression for the data content. |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1271 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1272 `concurrencychecker` is an optional function that receives 3 arguments: a |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1273 file handle, a filename, and an expected position. It should check whether |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1274 the current position in the file handle is valid, and log/warn/fail (by |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1275 raising). |
47257
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
1276 |
47399
7a0ec25d5836
revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47397
diff
changeset
|
1277 See mercurial/revlogutils/contants.py for details about the content of an |
7a0ec25d5836
revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47397
diff
changeset
|
1278 index entry. |
1083 | 1279 """ |
42996
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
1280 |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
1281 _flagserrorclass = error.RevlogError |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
1282 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1283 @staticmethod |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1284 def is_inline_index(header_bytes): |
51007
4ea606568f61
revlog: document the `is_inline_index` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50952
diff
changeset
|
1285 """Determine if a revlog is inline from the initial bytes of the index""" |
50789
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50761
diff
changeset
|
1286 if len(header_bytes) == 0: |
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50761
diff
changeset
|
1287 return True |
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50761
diff
changeset
|
1288 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1289 header = INDEX_HEADER.unpack(header_bytes)[0] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1290 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1291 _format_flags = header & ~0xFFFF |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1292 _format_version = header & 0xFFFF |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1293 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1294 features = FEATURES_BY_VERSION[_format_version] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1295 return features[b'inline'](_format_flags) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1296 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1297 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1298 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1299 opener, |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1300 target, |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1301 radix, |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1302 postfix=None, # only exist for `tmpcensored` now |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1303 checkambig=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1304 mmaplargeindex=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1305 censorable=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1306 upperboundcomp=None, |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
1307 persistentnodemap=False, |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1308 concurrencychecker=None, |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1309 trypending=False, |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
1310 try_split=False, |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
1311 canonical_parent_order=True, |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1312 data_config=None, |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1313 delta_config=None, |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1314 feature_config=None, |
51139
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1315 may_inline=True, # may inline new revlog |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1316 ): |
1083 | 1317 """ |
1318 create a revlog object | |
1319 | |
1320 opener is a function that abstracts the file opening operation | |
1321 and can be used to implement COW semantics or the like. | |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1322 |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1323 `target`: a (KIND, ID) tuple that identify the content stored in |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1324 this revlog. It help the rest of the code to understand what the revlog |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1325 is about without having to resort to heuristic and index filename |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1326 analysis. Note: that this must be reliably be set by normal code, but |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1327 that test, debug, or performance measurement code might not set this to |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1328 accurate value. |
1083 | 1329 """ |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1330 |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1331 self.radix = radix |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1332 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1333 self._docket_file = None |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1334 self._indexfile = None |
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1335 self._datafile = None |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1336 self._sidedatafile = None |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1337 self._nodemap_file = None |
47159
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
1338 self.postfix = postfix |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1339 self._trypending = trypending |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
1340 self._try_split = try_split |
51139
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1341 self._may_inline = may_inline |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
1342 self.opener = opener |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
1343 if persistentnodemap: |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1344 self._nodemap_file = nodemaputil.get_nodemap_file(self) |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
1345 |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1346 assert target[0] in ALL_KINDS |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1347 assert len(target) == 2 |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1348 self.target = target |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1349 if feature_config is not None: |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1350 self.feature_config = feature_config.copy() |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1351 elif b'feature-config' in self.opener.options: |
51036
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1352 self.feature_config = self.opener.options[b'feature-config'].copy() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1353 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1354 self.feature_config = FeatureConfig() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1355 self.feature_config.censorable = censorable |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1356 self.feature_config.canonical_parent_order = canonical_parent_order |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1357 if data_config is not None: |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1358 self.data_config = data_config.copy() |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1359 elif b'data-config' in self.opener.options: |
51036
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1360 self.data_config = self.opener.options[b'data-config'].copy() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1361 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1362 self.data_config = DataConfig() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1363 self.data_config.check_ambig = checkambig |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1364 self.data_config.mmap_large_index = mmaplargeindex |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1365 if delta_config is not None: |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1366 self.delta_config = delta_config.copy() |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1367 elif b'delta-config' in self.opener.options: |
51036
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1368 self.delta_config = self.opener.options[b'delta-config'].copy() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1369 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1370 self.delta_config = DeltaConfig() |
51087
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1371 self.delta_config.upper_bound_comp = upperboundcomp |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1372 |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1373 # Maps rev to chain base rev. |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1374 self._chainbasecache = util.lrucachedict(100) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1375 |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
1376 self.index = None |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1377 self._docket = None |
44366
76a96e3a2bbb
nodemap: keep track of the docket for loaded data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1378 self._nodemap_docket = None |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1379 # Mapping of partial identifiers to full nodes. |
13258
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
1380 self._pcache = {} |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
1381 |
49778
45d7b8c380d7
changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49772
diff
changeset
|
1382 # other optionnals features |
45d7b8c380d7
changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49772
diff
changeset
|
1383 |
39784
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
1384 # Make copy of flag processors so each revlog instance can support |
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
1385 # custom flags. |
42746
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42745
diff
changeset
|
1386 self._flagprocessors = dict(flagutil.flagprocessors) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
1387 # prevent nesting of addgroup |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
1388 self._adding_group = None |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
1389 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1390 chunk_cache = self._loadindex() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1391 self._load_inner(chunk_cache) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1392 self._concurrencychecker = concurrencychecker |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1393 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1394 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1395 def _generaldelta(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1396 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1397 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1398 b"use revlog.delta_config.general_delta", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1399 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1400 return self.delta_config.general_delta |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1401 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1402 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1403 def _checkambig(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1404 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1405 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1406 b"use revlog.data_config.checkambig", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1407 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1408 return self.data_config.check_ambig |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1409 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1410 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1411 def _mmaplargeindex(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1412 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1413 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1414 b"use revlog.data_config.mmap_large_index", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1415 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1416 return self.data_config.mmap_large_index |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1417 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1418 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1419 def _censorable(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1420 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1421 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1422 b"use revlog.feature_config.censorable", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1423 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1424 return self.feature_config.censorable |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1425 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1426 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1427 def _chunkcachesize(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1428 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1429 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1430 b"use revlog.data_config.chunk_cache_size", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1431 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1432 return self.data_config.chunk_cache_size |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1433 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1434 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1435 def _maxchainlen(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1436 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1437 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1438 b"use revlog.delta_config.max_chain_len", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1439 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1440 return self.delta_config.max_chain_len |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1441 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1442 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1443 def _deltabothparents(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1444 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1445 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1446 b"use revlog.delta_config.delta_both_parents", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1447 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1448 return self.delta_config.delta_both_parents |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1449 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1450 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1451 def _candidate_group_chunk_size(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1452 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1453 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1454 b"use revlog.delta_config.candidate_group_chunk_size", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1455 b"6.6", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1456 stacklevel=2, |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1457 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1458 return self.delta_config.candidate_group_chunk_size |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1459 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1460 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1461 def _debug_delta(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1462 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1463 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1464 b"use revlog.delta_config.debug_delta", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1465 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1466 return self.delta_config.debug_delta |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1467 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1468 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1469 def _compengine(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1470 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1471 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1472 b"use revlog.feature_config.compression_engine", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1473 b"6.6", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1474 stacklevel=2, |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1475 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1476 return self.feature_config.compression_engine |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1477 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1478 @property |
51087
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1479 def upperboundcomp(self): |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1480 """temporary compatibility proxy""" |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1481 util.nouideprecwarn( |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1482 b"use revlog.delta_config.upper_bound_comp", |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1483 b"6.6", |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1484 stacklevel=2, |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1485 ) |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1486 return self.delta_config.upper_bound_comp |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1487 |
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1488 @property |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1489 def _compengineopts(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1490 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1491 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1492 b"use revlog.feature_config.compression_engine_options", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1493 b"6.6", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1494 stacklevel=2, |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1495 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1496 return self.feature_config.compression_engine_options |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1497 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1498 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1499 def _maxdeltachainspan(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1500 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1501 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1502 b"use revlog.delta_config.max_deltachain_span", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1503 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1504 return self.delta_config.max_deltachain_span |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1505 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1506 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1507 def _withsparseread(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1508 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1509 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1510 b"use revlog.data_config.with_sparse_read", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1511 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1512 return self.data_config.with_sparse_read |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1513 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1514 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1515 def _sparserevlog(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1516 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1517 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1518 b"use revlog.delta_config.sparse_revlog", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1519 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1520 return self.delta_config.sparse_revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1521 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1522 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1523 def hassidedata(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1524 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1525 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1526 b"use revlog.feature_config.has_side_data", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1527 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1528 return self.feature_config.has_side_data |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1529 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1530 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1531 def _srdensitythreshold(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1532 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1533 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1534 b"use revlog.data_config.sr_density_threshold", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1535 b"6.6", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1536 stacklevel=2, |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1537 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1538 return self.data_config.sr_density_threshold |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1539 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1540 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1541 def _srmingapsize(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1542 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1543 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1544 b"use revlog.data_config.sr_min_gap_size", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1545 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1546 return self.data_config.sr_min_gap_size |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1547 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1548 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1549 def _compute_rank(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1550 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1551 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1552 b"use revlog.feature_config.compute_rank", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1553 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1554 return self.feature_config.compute_rank |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1555 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1556 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1557 def canonical_parent_order(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1558 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1559 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1560 b"use revlog.feature_config.canonical_parent_order", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1561 b"6.6", |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1562 stacklevel=2, |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1563 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1564 return self.feature_config.canonical_parent_order |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1565 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1566 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1567 def _lazydelta(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1568 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1569 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1570 b"use revlog.delta_config.lazy_delta", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1571 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1572 return self.delta_config.lazy_delta |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1573 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1574 @property |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1575 def _lazydeltabase(self): |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1576 """temporary compatibility proxy""" |
51073
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1577 util.nouideprecwarn( |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1578 b"use revlog.delta_config.lazy_delta_base", b"6.6", stacklevel=2 |
41c73325af52
revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51071
diff
changeset
|
1579 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1580 return self.delta_config.lazy_delta_base |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
1581 |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1582 def _init_opts(self): |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1583 """process options (from above/config) to setup associated default revlog mode |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1584 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1585 These values might be affected when actually reading on disk information. |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1586 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1587 The relevant values are returned for use in _loadindex(). |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1588 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1589 * newversionflags: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1590 version header to use if we need to create a new revlog |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1591 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1592 * mmapindexthreshold: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1593 minimal index size for start to use mmap |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1594 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1595 * force_nodemap: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1596 force the usage of a "development" version of the nodemap code |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1597 """ |
43027
3518da504303
vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43026
diff
changeset
|
1598 opts = self.opener.options |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1599 |
47274
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
1600 if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG: |
47277
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47274
diff
changeset
|
1601 new_header = CHANGELOGV2 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1602 compute_rank = opts.get(b'changelogv2.compute-rank', True) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1603 self.feature_config.compute_rank = compute_rank |
47274
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
1604 elif b'revlogv2' in opts: |
47272
80164d50ae3d
revlogv2: no longer attempt to use inline for new revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
1605 new_header = REVLOGV2 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1606 elif b'revlogv1' in opts: |
51139
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1607 new_header = REVLOGV1 |
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1608 if self._may_inline: |
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1609 new_header |= FLAG_INLINE_DATA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1610 if b'generaldelta' in opts: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1611 new_header |= FLAG_GENERALDELTA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1612 elif b'revlogv0' in self.opener.options: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1613 new_header = REVLOGV0 |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1614 else: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1615 new_header = REVLOG_DEFAULT_VERSION |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1616 |
51047
027bc364524b
revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
1617 mmapindexthreshold = None |
51054
3977068c638c
revlog: remove legacy usage of `_mmaplargeindex`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51053
diff
changeset
|
1618 if self.data_config.mmap_large_index: |
51047
027bc364524b
revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
1619 mmapindexthreshold = self.data_config.mmap_index_threshold |
51046
683b96c416d8
revlog: skip opener options to pass enable_ellipsis
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51045
diff
changeset
|
1620 if self.feature_config.enable_ellipsis: |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1621 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1622 |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1623 # revlog v0 doesn't have flag processors |
49019
ceafb0f81250
revlog: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49004
diff
changeset
|
1624 for flag, processor in opts.get(b'flagprocessors', {}).items(): |
42748
5109217a9ab6
flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42747
diff
changeset
|
1625 flagutil.insertflagprocessor(flag, processor, self._flagprocessors) |
40267
9d5ddf55415b
revlog: allow flag processors to be applied via store options
Matt Harbison <matt_harbison@yahoo.com>
parents:
40180
diff
changeset
|
1626 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1627 chunk_cache_size = self.data_config.chunk_cache_size |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1628 if chunk_cache_size <= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1629 raise error.RevlogError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
1630 _(b'revlog chunk cache size %r is not greater than 0') |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1631 % chunk_cache_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1632 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1633 elif chunk_cache_size & (chunk_cache_size - 1): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1634 raise error.RevlogError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
1635 _(b'revlog chunk cache size %r is not a power of 2') |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1636 % chunk_cache_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1637 ) |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1638 force_nodemap = opts.get(b'devel-force-nodemap', False) |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1639 return new_header, mmapindexthreshold, force_nodemap |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1640 |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1641 def _get_data(self, filepath, mmap_threshold, size=None): |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1642 """return a file content with or without mmap |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1643 |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1644 If the file is missing return the empty string""" |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1645 try: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1646 with self.opener(filepath) as fp: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1647 if mmap_threshold is not None: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1648 file_size = self.opener.fstat(fp).st_size |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1649 if file_size >= mmap_threshold: |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1650 if size is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1651 # avoid potentiel mmap crash |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1652 size = min(file_size, size) |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1653 # TODO: should .close() to release resources without |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1654 # relying on Python GC |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1655 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1656 return util.buffer(util.mmapread(fp)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1657 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1658 return util.buffer(util.mmapread(fp, size)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1659 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1660 return fp.read() |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1661 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1662 return fp.read(size) |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
1663 except FileNotFoundError: |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1664 return b'' |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1665 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1666 def get_streams(self, max_linkrev, force_inline=False): |
51008
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1667 """return a list of streams that represent this revlog |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1668 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1669 This is used by stream-clone to do bytes to bytes copies of a repository. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1670 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1671 This streams data for all revisions that refer to a changelog revision up |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1672 to `max_linkrev`. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1673 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1674 If `force_inline` is set, it enforces that the stream will represent an inline revlog. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1675 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1676 It returns is a list of three-tuple: |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1677 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1678 [ |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1679 (filename, bytes_stream, stream_size), |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1680 … |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1681 ] |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1682 """ |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1683 n = len(self) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1684 index = self.index |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1685 while n > 0: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1686 linkrev = index[n - 1][4] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1687 if linkrev < max_linkrev: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1688 break |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1689 # note: this loop will rarely go through multiple iterations, since |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1690 # it only traverses commits created during the current streaming |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1691 # pull operation. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1692 # |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1693 # If this become a problem, using a binary search should cap the |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1694 # runtime of this. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1695 n = n - 1 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1696 if n == 0: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1697 # no data to send |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1698 return [] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1699 index_size = n * index.entry_size |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1700 data_size = self.end(n - 1) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1701 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1702 # XXX we might have been split (or stripped) since the object |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1703 # initialization, We need to close this race too, but having a way to |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1704 # pre-open the file we feed to the revlog and never closing them before |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1705 # we are done streaming. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1706 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1707 if self._inline: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1708 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1709 def get_stream(): |
51085
5ffee3cff8de
revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51084
diff
changeset
|
1710 with self.opener(self._indexfile, mode=b"r") as fp: |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1711 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1712 size = index_size + data_size |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1713 if size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1714 yield fp.read(size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1715 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1716 yield from util.filechunkiter(fp, limit=size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1717 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1718 inline_stream = get_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1719 next(inline_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1720 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1721 (self._indexfile, inline_stream, index_size + data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1722 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1723 elif force_inline: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1724 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1725 def get_stream(): |
51023
720e5a5f2b95
stream-clone: use `revlog.reading` in `revlog.get_streams`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51021
diff
changeset
|
1726 with self.reading(): |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1727 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1728 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1729 for rev in range(n): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1730 idx = self.index.entry_binary(rev) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1731 if rev == 0 and self._docket is None: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1732 # re-inject the inline flag |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1733 header = self._format_flags |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1734 header |= self._format_version |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1735 header |= FLAG_INLINE_DATA |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1736 header = self.index.pack_header(header) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1737 idx = header + idx |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1738 yield idx |
51091
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
1739 yield self._inner.get_segment_for_revs(rev, rev)[1] |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1740 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1741 inline_stream = get_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1742 next(inline_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1743 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1744 (self._indexfile, inline_stream, index_size + data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1745 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1746 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1747 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1748 def get_index_stream(): |
51085
5ffee3cff8de
revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51084
diff
changeset
|
1749 with self.opener(self._indexfile, mode=b"r") as fp: |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1750 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1751 if index_size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1752 yield fp.read(index_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1753 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1754 yield from util.filechunkiter(fp, limit=index_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1755 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1756 def get_data_stream(): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1757 with self._datafp() as fp: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1758 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1759 if data_size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1760 yield fp.read(data_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1761 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1762 yield from util.filechunkiter(fp, limit=data_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1763 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1764 index_stream = get_index_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1765 next(index_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1766 data_stream = get_data_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1767 next(data_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1768 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1769 (self._datafile, data_stream, data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1770 (self._indexfile, index_stream, index_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1771 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1772 |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1773 def _loadindex(self, docket=None): |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1774 |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1775 new_header, mmapindexthreshold, force_nodemap = self._init_opts() |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1776 |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1777 if self.postfix is not None: |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1778 entry_point = b'%s.i.%s' % (self.radix, self.postfix) |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1779 elif self._trypending and self.opener.exists(b'%s.i.a' % self.radix): |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1780 entry_point = b'%s.i.a' % self.radix |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
1781 elif self._try_split and self.opener.exists(self._split_index_file): |
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
1782 entry_point = self._split_index_file |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1783 else: |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1784 entry_point = b'%s.i' % self.radix |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1785 |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1786 if docket is not None: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1787 self._docket = docket |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1788 self._docket_file = entry_point |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1789 else: |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1790 self._initempty = True |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1791 entry_data = self._get_data(entry_point, mmapindexthreshold) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1792 if len(entry_data) > 0: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1793 header = INDEX_HEADER.unpack(entry_data[:4])[0] |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1794 self._initempty = False |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1795 else: |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1796 header = new_header |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1797 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1798 self._format_flags = header & ~0xFFFF |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1799 self._format_version = header & 0xFFFF |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1800 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1801 supported_flags = SUPPORTED_FLAGS.get(self._format_version) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1802 if supported_flags is None: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1803 msg = _(b'unknown version (%d) in revlog %s') |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1804 msg %= (self._format_version, self.display_id) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1805 raise error.RevlogError(msg) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1806 elif self._format_flags & ~supported_flags: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1807 msg = _(b'unknown flags (%#04x) in version %d revlog %s') |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1808 display_flag = self._format_flags >> 16 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1809 msg %= (display_flag, self._format_version, self.display_id) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1810 raise error.RevlogError(msg) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1811 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1812 features = FEATURES_BY_VERSION[self._format_version] |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1813 self._inline = features[b'inline'](self._format_flags) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1814 self.delta_config.general_delta = features[b'generaldelta']( |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1815 self._format_flags |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1816 ) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1817 self.feature_config.has_side_data = features[b'sidedata'] |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1818 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1819 if not features[b'docket']: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1820 self._indexfile = entry_point |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1821 index_data = entry_data |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1822 else: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1823 self._docket_file = entry_point |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1824 if self._initempty: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1825 self._docket = docketutil.default_docket(self, header) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1826 else: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1827 self._docket = docketutil.parse_docket( |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1828 self, entry_data, use_pending=self._trypending |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1829 ) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1830 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1831 if self._docket is not None: |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1832 self._indexfile = self._docket.index_filepath() |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1833 index_data = b'' |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1834 index_size = self._docket.index_end |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1835 if index_size > 0: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1836 index_data = self._get_data( |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1837 self._indexfile, mmapindexthreshold, size=index_size |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1838 ) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1839 if len(index_data) < index_size: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1840 msg = _(b'too few index data for %s: got %d, expected %d') |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1841 msg %= (self.display_id, len(index_data), index_size) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1842 raise error.RevlogError(msg) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1843 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1844 self._inline = False |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1845 # generaldelta implied by version 2 revlogs. |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1846 self.delta_config.general_delta = True |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1847 # the logic for persistent nodemap will be dealt with within the |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1848 # main docket, so disable it for now. |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1849 self._nodemap_file = None |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1850 |
47332
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47305
diff
changeset
|
1851 if self._docket is not None: |
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47305
diff
changeset
|
1852 self._datafile = self._docket.data_filepath() |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1853 self._sidedatafile = self._docket.sidedata_filepath() |
47332
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47305
diff
changeset
|
1854 elif self.postfix is None: |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1855 self._datafile = b'%s.d' % self.radix |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1856 else: |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1857 self._datafile = b'%s.d.%s' % (self.radix, self.postfix) |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1858 |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
1859 self.nodeconstants = sha1nodeconstants |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
1860 self.nullid = self.nodeconstants.nullid |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
1861 |
41312
189e06b2d719
revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents:
41310
diff
changeset
|
1862 # sparse-revlog can't be on without general-delta (issue6056) |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
1863 if not self.delta_config.general_delta: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1864 self.delta_config.sparse_revlog = False |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
1865 |
39260
0a5b20c107a6
repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39259
diff
changeset
|
1866 self._storedeltachains = True |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30014
diff
changeset
|
1867 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1868 devel_nodemap = ( |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1869 self._nodemap_file |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1870 and force_nodemap |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1871 and parse_index_v1_nodemap is not None |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1872 ) |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1873 |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1874 use_rust_index = False |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1875 if rustrevlog is not None: |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1876 if self._nodemap_file is not None: |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1877 use_rust_index = True |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1878 else: |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1879 use_rust_index = self.opener.options.get(b'rust.index') |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1880 |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1881 self._parse_index = parse_index_v1 |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
1882 if self._format_version == REVLOGV0: |
47079
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
1883 self._parse_index = revlogv0.parse_index_v0 |
47187
ef7a8a1622ad
revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
1884 elif self._format_version == REVLOGV2: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1885 self._parse_index = parse_index_v2 |
47277
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47274
diff
changeset
|
1886 elif self._format_version == CHANGELOGV2: |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
1887 self._parse_index = parse_index_cl_v2 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1888 elif devel_nodemap: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1889 self._parse_index = parse_index_v1_nodemap |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1890 elif use_rust_index: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1891 self._parse_index = parse_index_v1_mixed |
13265
04b302ce2781
revlog: always add the magic nullid/nullrev entry in parseindex
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13264
diff
changeset
|
1892 try: |
47190
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
1893 d = self._parse_index(index_data, self._inline) |
47431
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47420
diff
changeset
|
1894 index, chunkcache = d |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1895 use_nodemap = ( |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1896 not self._inline |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1897 and self._nodemap_file is not None |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
1898 and hasattr(index, 'update_nodemap_data') |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1899 ) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1900 if use_nodemap: |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1901 nodemap_data = nodemaputil.persisted_data(self) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1902 if nodemap_data is not None: |
44525
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1903 docket = nodemap_data[0] |
44803
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1904 if ( |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1905 len(d[0]) > docket.tip_rev |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1906 and d[0][docket.tip_rev][7] == docket.tip_node |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1907 ): |
44525
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1908 # no changelog tampering |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1909 self._nodemap_docket = docket |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1910 index.update_nodemap_data(*nodemap_data) |
13265
04b302ce2781
revlog: always add the magic nullid/nullrev entry in parseindex
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13264
diff
changeset
|
1911 except (ValueError, IndexError): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1912 raise error.RevlogError( |
47172
e1936ae27897
revlog: use revlog.display_id for corruption error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47171
diff
changeset
|
1913 _(b"index %s is corrupted") % self.display_id |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1914 ) |
47431
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47420
diff
changeset
|
1915 self.index = index |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
1916 # revnum -> (chain-length, sum-delta-length) |
45802
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
1917 self._chaininfocache = util.lrucachedict(500) |
116
e484cd5ec282
Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents:
115
diff
changeset
|
1918 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1919 return chunkcache |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1920 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1921 def _load_inner(self, chunk_cache): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1922 if self._docket is None: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1923 default_compression_header = None |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1924 else: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1925 default_compression_header = self._docket.default_compression_header |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1926 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1927 self._inner = _InnerRevlog( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1928 opener=self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1929 index=self.index, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1930 index_file=self._indexfile, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1931 data_file=self._datafile, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1932 sidedata_file=self._sidedatafile, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1933 inline=self._inline, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1934 data_config=self.data_config, |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
1935 delta_config=self.delta_config, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1936 feature_config=self.feature_config, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1937 chunk_cache=chunk_cache, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1938 default_compression_header=default_compression_header, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1939 ) |
116
e484cd5ec282
Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents:
115
diff
changeset
|
1940 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1941 def get_revlog(self): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1942 """simple function to mirror API of other not-really-revlog API""" |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1943 return self |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1944 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
1945 @util.propertycache |
47090
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1946 def revlog_kind(self): |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1947 return self.target[0] |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1948 |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1949 @util.propertycache |
47167
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
1950 def display_id(self): |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
1951 """The public facing "ID" of the revlog that we use in message""" |
49712
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1952 if self.revlog_kind == KIND_FILELOG: |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1953 # Reference the file without the "data/" prefix, so it is familiar |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1954 # to the user. |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1955 return self.target[1] |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1956 else: |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1957 return self.radix |
47167
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
1958 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1959 def _datafp(self, mode=b'r'): |
36006
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35885
diff
changeset
|
1960 """file object for the revlog's data file""" |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
1961 return self.opener(self._datafile, mode=mode) |
36006
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35885
diff
changeset
|
1962 |
43492
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1963 def tiprev(self): |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1964 return len(self.index) - 1 |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1965 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1966 def tip(self): |
43492
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1967 return self.node(self.tiprev()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1968 |
24030
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
1969 def __contains__(self, rev): |
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
1970 return 0 <= rev < len(self) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1971 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1972 def __len__(self): |
38890
781b2720d2ac
index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38889
diff
changeset
|
1973 return len(self.index) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1974 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1975 def __iter__(self): |
49292
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
49263
diff
changeset
|
1976 return iter(range(len(self))) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1977 |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
1978 def revs(self, start=0, stop=None): |
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
1979 """iterate over all rev in this revlog (from start to stop)""" |
39886
d63153611ed5
storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39884
diff
changeset
|
1980 return storageutil.iterrevs(len(self), start=start, stop=stop) |
13275
68da048b4c88
revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents:
13268
diff
changeset
|
1981 |
16374
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1982 def hasnode(self, node): |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1983 try: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1984 self.rev(node) |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1985 return True |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1986 except KeyError: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1987 return False |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1988 |
51009
39fa0b948f5a
revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51008
diff
changeset
|
1989 def _candelta(self, baserev, rev): |
35839
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1990 """whether two revisions (baserev, rev) can be delta-ed or not""" |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1991 # Disable delta if either rev requires a content-changing flag |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1992 # processor (ex. LFS). This is because such flag processor can alter |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1993 # the rawtext content that the delta will be based on, and two clients |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1994 # could have a same revlog node with different flags (i.e. different |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1995 # rawtext contents) and the delta could be incompatible. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1996 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1997 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1998 ): |
35839
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1999 return False |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
2000 return True |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
2001 |
44465
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
2002 def update_caches(self, transaction): |
51010
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
2003 """update on disk cache |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
2004 |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
2005 If a transaction is passed, the update may be delayed to transaction |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
2006 commit.""" |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
2007 if self._nodemap_file is not None: |
44465
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
2008 if transaction is None: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
2009 nodemaputil.update_persistent_nodemap(self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
2010 else: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
2011 nodemaputil.setup_persistent_nodemap(transaction, self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
2012 |
16414
e8d37b78acfb
parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents:
16375
diff
changeset
|
2013 def clearcaches(self): |
51011
6c3798b4597f
revlog: document the `clearcaches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51010
diff
changeset
|
2014 """Clear in-memory caches""" |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2015 self._chainbasecache.clear() |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
2016 self._inner.clear_cache() |
27465
072a675c51f2
revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27449
diff
changeset
|
2017 self._pcache = {} |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2018 self._nodemap_docket = None |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
2019 self.index.clearcaches() |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2020 # The python code is the one responsible for validating the docket, we |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2021 # end up having to refresh it here. |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2022 use_nodemap = ( |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2023 not self._inline |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
2024 and self._nodemap_file is not None |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
2025 and hasattr(self.index, 'update_nodemap_data') |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2026 ) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2027 if use_nodemap: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2028 nodemap_data = nodemaputil.persisted_data(self) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2029 if nodemap_data is not None: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2030 self._nodemap_docket = nodemap_data[0] |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
2031 self.index.update_nodemap_data(*nodemap_data) |
16414
e8d37b78acfb
parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents:
16375
diff
changeset
|
2032 |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
2033 def rev(self, node): |
51012
ccddd2f54013
revlog: document the `rev` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51011
diff
changeset
|
2034 """return the revision number associated with a <nodeid>""" |
13275
68da048b4c88
revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents:
13268
diff
changeset
|
2035 try: |
43601
2da51e292734
index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
2036 return self.index.rev(node) |
22282
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
21752
diff
changeset
|
2037 except TypeError: |
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
21752
diff
changeset
|
2038 raise |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2039 except error.RevlogError: |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
2040 # parsers.c radix tree lookup failed |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2041 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2042 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2043 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2044 ): |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
2045 raise error.WdirUnsupported |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2046 raise error.LookupError(node, self.display_id, _(b'no node')) |
13275
68da048b4c88
revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents:
13268
diff
changeset
|
2047 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2048 # Accessors for index entries. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2049 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2050 # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2051 # are flags. |
2072 | 2052 def start(self, rev): |
5006
c2febf5420e9
revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents:
5005
diff
changeset
|
2053 return int(self.index[rev][0] >> 16) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2054 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2055 def sidedata_cut_off(self, rev): |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2056 sd_cut_off = self.index[rev][8] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2057 if sd_cut_off != 0: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2058 return sd_cut_off |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2059 # This is some annoying dance, because entries without sidedata |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2060 # currently use 0 as their ofsset. (instead of previous-offset + |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2061 # previous-size) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2062 # |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2063 # We should reconsider this sidedata → 0 sidata_offset policy. |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2064 # In the meantime, we need this. |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2065 while 0 <= rev: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2066 e = self.index[rev] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2067 if e[9] != 0: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2068 return e[8] + e[9] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2069 rev -= 1 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2070 return 0 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2071 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2072 def flags(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2073 return self.index[rev][0] & 0xFFFF |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2074 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2075 def length(self, rev): |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2076 return self.index[rev][1] |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2077 |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2078 def sidedata_length(self, rev): |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
2079 if not self.feature_config.has_side_data: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2080 return 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2081 return self.index[rev][9] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2082 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2083 def rawsize(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2084 """return the length of the uncompressed text for a given revision""" |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2085 l = self.index[rev][2] |
38210
7fa3408f83ef
revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents:
38202
diff
changeset
|
2086 if l >= 0: |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2087 return l |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2088 |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
2089 t = self.rawdata(rev) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2090 return len(t) |
31856
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2091 |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2092 def size(self, rev): |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2093 """length of non-raw text (processed by a "read" flag processor)""" |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2094 # fast path: if no "read" flag processor could change the content, |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2095 # size is rawsize. note: ELLIPSIS is known to not change the content. |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2096 flags = self.flags(rev) |
42747
92ac6b1697a7
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42746
diff
changeset
|
2097 if flags & (flagutil.REVIDX_KNOWN_FLAGS ^ REVIDX_ELLIPSIS) == 0: |
31856
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2098 return self.rawsize(rev) |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
2099 |
48564
c514936d92b4
revlog: remove deprecated APIs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48287
diff
changeset
|
2100 return len(self.revision(rev)) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2101 |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2102 def fast_rank(self, rev): |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2103 """Return the rank of a revision if already known, or None otherwise. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2104 |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2105 The rank of a revision is the size of the sub-graph it defines as a |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2106 head. Equivalently, the rank of a revision `r` is the size of the set |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2107 `ancestors(r)`, `r` included. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2108 |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2109 This method returns the rank retrieved from the revlog in constant |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2110 time. It makes no attempt at computing unknown values for versions of |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2111 the revlog which do not persist the rank. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2112 """ |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2113 rank = self.index[rev][ENTRY_RANK] |
48942
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48772
diff
changeset
|
2114 if self._format_version != CHANGELOGV2 or rank == RANK_UNKNOWN: |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2115 return None |
48942
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48772
diff
changeset
|
2116 if rev == nullrev: |
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48772
diff
changeset
|
2117 return 0 # convention |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2118 return rank |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
2119 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
2120 def chainbase(self, rev): |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2121 base = self._chainbasecache.get(rev) |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2122 if base is not None: |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2123 return base |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2124 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
2125 index = self.index |
38202
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
2126 iterrev = rev |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
2127 base = index[iterrev][3] |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
2128 while base != iterrev: |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
2129 iterrev = base |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
2130 base = index[iterrev][3] |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2131 |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
2132 self._chainbasecache[rev] = base |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
2133 return base |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2134 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2135 def linkrev(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2136 return self.index[rev][4] |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2137 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2138 def parentrevs(self, rev): |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
2139 try: |
35525
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35354
diff
changeset
|
2140 entry = self.index[rev] |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
2141 except IndexError: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
2142 if rev == wdirrev: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
2143 raise error.WdirUnsupported |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
2144 raise |
47052
411dc27fd9fd
corruption: backout changeset 49fd21f32695 (issue6528)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
2145 |
51070
14574a41a7a7
revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51069
diff
changeset
|
2146 if self.feature_config.canonical_parent_order and entry[5] == nullrev: |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2147 return entry[6], entry[5] |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2148 else: |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2149 return entry[5], entry[6] |
35525
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35354
diff
changeset
|
2150 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2151 # fast parentrevs(rev) where rev isn't filtered |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2152 _uncheckedparentrevs = parentrevs |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2153 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2154 def node(self, rev): |
32481
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2155 try: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2156 return self.index[rev][7] |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2157 except IndexError: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2158 if rev == wdirrev: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2159 raise error.WdirUnsupported |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2160 raise |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2161 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2162 # Derived from index values. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2163 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2164 def end(self, rev): |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2165 return self.start(rev) + self.length(rev) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2166 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2167 def parents(self, node): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2168 i = self.index |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2169 d = i[self.rev(node)] |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2170 # inline node() to avoid function call overhead |
51070
14574a41a7a7
revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51069
diff
changeset
|
2171 if self.feature_config.canonical_parent_order and d[5] == self.nullid: |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2172 return i[d[6]][7], i[d[5]][7] |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2173 else: |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2174 return i[d[5]][7], i[d[6]][7] |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2175 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2176 def chainlen(self, rev): |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2177 return self._chaininfo(rev)[0] |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2178 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2179 def _chaininfo(self, rev): |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2180 chaininfocache = self._chaininfocache |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2181 if rev in chaininfocache: |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2182 return chaininfocache[rev] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2183 index = self.index |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
2184 generaldelta = self.delta_config.general_delta |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2185 iterrev = rev |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2186 e = index[iterrev] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2187 clen = 0 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2188 compresseddeltalen = 0 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2189 while iterrev != e[3]: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2190 clen += 1 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2191 compresseddeltalen += e[1] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2192 if generaldelta: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2193 iterrev = e[3] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2194 else: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2195 iterrev -= 1 |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2196 if iterrev in chaininfocache: |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2197 t = chaininfocache[iterrev] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2198 clen += t[0] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2199 compresseddeltalen += t[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2200 break |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2201 e = index[iterrev] |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2202 else: |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2203 # Add text length of base since decompressing that also takes |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2204 # work. For cache hits the length is already included. |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2205 compresseddeltalen += e[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2206 r = (clen, compresseddeltalen) |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2207 chaininfocache[rev] = r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2208 return r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2209 |
27468
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
2210 def _deltachain(self, rev, stoprev=None): |
51099
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
2211 return self._inner._deltachain(rev, stoprev=stoprev) |
27468
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
2212 |
18081
f88c60e740a1
revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents:
17975
diff
changeset
|
2213 def ancestors(self, revs, stoprev=0, inclusive=False): |
40772
8947f49daaa8
revlog: update the docstring of `ancestors` to match reality
Boris Feld <boris.feld@octobus.net>
parents:
40671
diff
changeset
|
2214 """Generate the ancestors of 'revs' in reverse revision order. |
16868
eb88ed4269c5
revlog: add optional stoprev arg to revlog.ancestors()
Joshua Redstone <joshua.redstone@fb.com>
parents:
16867
diff
changeset
|
2215 Does not generate revs lower than stoprev. |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2216 |
18090
9abc55ef85b5
revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents:
18083
diff
changeset
|
2217 See the documentation for ancestor.lazyancestors for more details.""" |
18081
f88c60e740a1
revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents:
17975
diff
changeset
|
2218 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2219 # first, make sure start revisions aren't filtered |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2220 revs = list(revs) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2221 checkrev = self.node |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2222 for r in revs: |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2223 checkrev(r) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2224 # and we're sure ancestors aren't filtered as well |
41118
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2225 |
47280
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47277
diff
changeset
|
2226 if rustancestor is not None and self.index.rust_ext_compat: |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
2227 lazyancestors = rustancestor.LazyAncestors |
41118
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2228 arg = self.index |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2229 else: |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2230 lazyancestors = ancestor.lazyancestors |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2231 arg = self._uncheckedparentrevs |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2232 return lazyancestors(arg, revs, stoprev=stoprev, inclusive=inclusive) |
6872
c7cc40fd74f6
Add ancestors and descendants to revlog
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
6750
diff
changeset
|
2233 |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16866
diff
changeset
|
2234 def descendants(self, revs): |
40000
0b24fcd88066
dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39913
diff
changeset
|
2235 return dagop.descendantrevs(revs, self.revs, self.parentrevs) |
6872
c7cc40fd74f6
Add ancestors and descendants to revlog
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
6750
diff
changeset
|
2236 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2237 def findcommonmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2238 """Return a tuple of the ancestors of common and the ancestors of heads |
15835
fa15869bf95c
revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15827
diff
changeset
|
2239 that are not ancestors of common. In revset terminology, we return the |
fa15869bf95c
revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15827
diff
changeset
|
2240 tuple: |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2241 |
15835
fa15869bf95c
revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15827
diff
changeset
|
2242 ::common, (::heads) - (::common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2243 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2244 The list is sorted by revision number, meaning it is |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2245 topologically sorted. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2246 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2247 'heads' and 'common' are both lists of node IDs. If heads is |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2248 not supplied, uses all of the revlog's heads. If common is not |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2249 supplied, uses nullid.""" |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2250 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2251 common = [self.nullid] |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2252 if heads is None: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2253 heads = self.heads() |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2254 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2255 common = [self.rev(n) for n in common] |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2256 heads = [self.rev(n) for n in heads] |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2257 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2258 # we want the ancestors, but inclusive |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49019
diff
changeset
|
2259 class lazyset: |
20073
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2260 def __init__(self, lazyvalues): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2261 self.addedvalues = set() |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2262 self.lazyvalues = lazyvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2263 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2264 def __contains__(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2265 return value in self.addedvalues or value in self.lazyvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2266 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2267 def __iter__(self): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2268 added = self.addedvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2269 for r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2270 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2271 for r in self.lazyvalues: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2272 if not r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2273 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2274 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2275 def add(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2276 self.addedvalues.add(value) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2277 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2278 def update(self, values): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2279 self.addedvalues.update(values) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2280 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2281 has = lazyset(self.ancestors(common)) |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2282 has.add(nullrev) |
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2283 has.update(common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2284 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2285 # take all ancestors from heads that aren't in has |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2286 missing = set() |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
2287 visit = collections.deque(r for r in heads if r not in has) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2288 while visit: |
16803
107a3270a24a
cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents:
16786
diff
changeset
|
2289 r = visit.popleft() |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2290 if r in missing: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2291 continue |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2292 else: |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2293 missing.add(r) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2294 for p in self.parentrevs(r): |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2295 if p not in has: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2296 visit.append(p) |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2297 missing = list(missing) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2298 missing.sort() |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2299 return has, [self.node(miss) for miss in missing] |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2300 |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2301 def incrementalmissingrevs(self, common=None): |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2302 """Return an object that can be used to incrementally compute the |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2303 revision numbers of the ancestors of arbitrary sets that are not |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2304 ancestors of common. This is an ancestor.incrementalmissingancestors |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2305 object. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2306 |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2307 'common' is a list of revision numbers. If common is not supplied, uses |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2308 nullrev. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2309 """ |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2310 if common is None: |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2311 common = [nullrev] |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2312 |
47280
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47277
diff
changeset
|
2313 if rustancestor is not None and self.index.rust_ext_compat: |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
2314 return rustancestor.MissingAncestors(self.index, common) |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2315 return ancestor.incrementalmissingancestors(self.parentrevs, common) |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2316 |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2317 def findmissingrevs(self, common=None, heads=None): |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2318 """Return the revision numbers of the ancestors of heads that |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2319 are not ancestors of common. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2320 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2321 More specifically, return a list of revision numbers corresponding to |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2322 nodes N such that every N satisfies the following constraints: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2323 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2324 1. N is an ancestor of some node in 'heads' |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2325 2. N is not an ancestor of any node in 'common' |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2326 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2327 The list is sorted by revision number, meaning it is |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2328 topologically sorted. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2329 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2330 'heads' and 'common' are both lists of revision numbers. If heads is |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2331 not supplied, uses all of the revlog's heads. If common is not |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2332 supplied, uses nullid.""" |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2333 if common is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2334 common = [nullrev] |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2335 if heads is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2336 heads = self.headrevs() |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2337 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2338 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2339 return inc.missingancestors(heads) |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2340 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2341 def findmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2342 """Return the ancestors of heads that are not ancestors of common. |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2343 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2344 More specifically, return a list of nodes N such that every N |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2345 satisfies the following constraints: |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2346 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2347 1. N is an ancestor of some node in 'heads' |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2348 2. N is not an ancestor of any node in 'common' |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2349 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2350 The list is sorted by revision number, meaning it is |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2351 topologically sorted. |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2352 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2353 'heads' and 'common' are both lists of node IDs. If heads is |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2354 not supplied, uses all of the revlog's heads. If common is not |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2355 supplied, uses nullid.""" |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2356 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2357 common = [self.nullid] |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2358 if heads is None: |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2359 heads = self.heads() |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2360 |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2361 common = [self.rev(n) for n in common] |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2362 heads = [self.rev(n) for n in heads] |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2363 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2364 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2365 return [self.node(r) for r in inc.missingancestors(heads)] |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2366 |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2367 def nodesbetween(self, roots=None, heads=None): |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2368 """Return a topological path from 'roots' to 'heads'. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2369 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2370 Return a tuple (nodes, outroots, outheads) where 'nodes' is a |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2371 topologically sorted list of all nodes N that satisfy both of |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2372 these constraints: |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2373 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2374 1. N is a descendant of some node in 'roots' |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2375 2. N is an ancestor of some node in 'heads' |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2376 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2377 Every node is considered to be both a descendant and an ancestor |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2378 of itself, so every reachable node in 'roots' and 'heads' will be |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2379 included in 'nodes'. |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2380 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2381 'outroots' is the list of reachable nodes in 'roots', i.e., the |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2382 subset of 'roots' that is returned in 'nodes'. Likewise, |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2383 'outheads' is the subset of 'heads' that is also in 'nodes'. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2384 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2385 'roots' and 'heads' are both lists of node IDs. If 'roots' is |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2386 unspecified, uses nullid as the only root. If 'heads' is |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2387 unspecified, uses list of all of the revlog's heads.""" |
1463
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2388 nonodes = ([], [], []) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2389 if roots is not None: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2390 roots = list(roots) |
1463
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2391 if not roots: |
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2392 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2393 lowestrev = min([self.rev(n) for n in roots]) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2394 else: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2395 roots = [self.nullid] # Everybody's a descendant of nullid |
3578
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
2396 lowestrev = nullrev |
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
2397 if (lowestrev == nullrev) and (heads is None): |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2398 # We want _all_ the nodes! |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2399 return ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2400 [self.node(r) for r in self], |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2401 [self.nullid], |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2402 list(self.heads()), |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2403 ) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2404 if heads is None: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2405 # All nodes are ancestors, so the latest ancestor is the last |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2406 # node. |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2407 highestrev = len(self) - 1 |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2408 # Set ancestors to None to signal that every node is an ancestor. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2409 ancestors = None |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2410 # Set heads to an empty dictionary for later discovery of heads |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2411 heads = {} |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2412 else: |
1463
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2413 heads = list(heads) |
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2414 if not heads: |
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2415 return nonodes |
8464
7af92e70bb25
revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8453
diff
changeset
|
2416 ancestors = set() |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2417 # Turn heads into a dictionary so we can remove 'fake' heads. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2418 # Also, later we will be using it to filter out the heads we can't |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2419 # find from roots. |
14219
c33427080671
revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
2420 heads = dict.fromkeys(heads, False) |
3360
ef8307585b41
nodesbetween: fix a bug with duplicate heads
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3335
diff
changeset
|
2421 # Start at the top and keep marking parents until we're done. |
8163
62d7287fe6b0
rebase, revlog: use set(x) instead of set(x.keys())
Martin Geisler <mg@lazybytes.net>
parents:
8153
diff
changeset
|
2422 nodestotag = set(heads) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2423 # Remember where the top was so we can use it as a limit later. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2424 highestrev = max([self.rev(n) for n in nodestotag]) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2425 while nodestotag: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2426 # grab a node to tag |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2427 n = nodestotag.pop() |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2428 # Never tag nullid |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2429 if n == self.nullid: |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2430 continue |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2431 # A node's revision number represents its place in a |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2432 # topologically sorted list of nodes. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2433 r = self.rev(n) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2434 if r >= lowestrev: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2435 if n not in ancestors: |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2436 # If we are possibly a descendant of one of the roots |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2437 # and we haven't already been marked as an ancestor |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2438 ancestors.add(n) # Mark as ancestor |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2439 # Add non-nullid parents to list of nodes to tag. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2440 nodestotag.update( |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2441 [p for p in self.parents(n) if p != self.nullid] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2442 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2443 elif n in heads: # We've seen it before, is it a fake head? |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2444 # So it is, real heads should not be the ancestors of |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2445 # any other heads. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2446 heads.pop(n) |
1459
106fdec8e1fb
Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
2447 if not ancestors: |
1463
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2448 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2449 # Now that we have our set of ancestors, we want to remove any |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2450 # roots that are not ancestors. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2451 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2452 # If one of the roots was nullid, everything is included anyway. |
3578
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
2453 if lowestrev > nullrev: |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2454 # But, since we weren't, let's recompute the lowest rev to not |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2455 # include roots that aren't ancestors. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2456 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2457 # Filter out roots that aren't ancestors of heads |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2458 roots = [root for root in roots if root in ancestors] |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2459 # Recompute the lowest revision |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2460 if roots: |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2461 lowestrev = min([self.rev(root) for root in roots]) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2462 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2463 # No more roots? Return empty list |
1463
26e73acc0cdf
Fix to handle case of empty list for roots or heads in nodesbetween.
Eric Hopper <hopper@omnifarious.org>
parents:
1459
diff
changeset
|
2464 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2465 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2466 # We are descending from nullid, and don't need to care about |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2467 # any other roots. |
3578
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
2468 lowestrev = nullrev |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2469 roots = [self.nullid] |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2470 # Transform our roots list into a set. |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2471 descendants = set(roots) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2472 # Also, keep the original roots so we can filter out roots that aren't |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2473 # 'real' roots (i.e. are descended from other roots). |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2474 roots = descendants.copy() |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2475 # Our topologically sorted list of output nodes. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2476 orderedout = [] |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2477 # Don't start at nullid since we don't want nullid in our output list, |
17483 | 2478 # and if nullid shows up in descendants, empty parents will look like |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2479 # they're descendants. |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
2480 for r in self.revs(start=max(lowestrev, 0), stop=highestrev + 1): |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2481 n = self.node(r) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2482 isdescendant = False |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2483 if lowestrev == nullrev: # Everybody is a descendant of nullid |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2484 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2485 elif n in descendants: |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2486 # n is already a descendant |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2487 isdescendant = True |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2488 # This check only needs to be done here because all the roots |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2489 # will start being marked is descendants before the loop. |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2490 if n in roots: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2491 # If n was a root, check if it's a 'real' root. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2492 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2493 # If any of its parents are descendants, it's not a root. |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2494 if (p[0] in descendants) or (p[1] in descendants): |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2495 roots.remove(n) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2496 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2497 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2498 # A node is a descendant if either of its parents are |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2499 # descendants. (We seeded the dependents list with the roots |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2500 # up there, remember?) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2501 if (p[0] in descendants) or (p[1] in descendants): |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2502 descendants.add(n) |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2503 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2504 if isdescendant and ((ancestors is None) or (n in ancestors)): |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2505 # Only include nodes that are both descendants and ancestors. |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2506 orderedout.append(n) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2507 if (ancestors is not None) and (n in heads): |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2508 # We're trying to figure out which heads are reachable |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2509 # from roots. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2510 # Mark this head as having been reached |
14219
c33427080671
revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
2511 heads[n] = True |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2512 elif ancestors is None: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2513 # Otherwise, we're trying to discover the heads. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2514 # Assume this is a head because if it isn't, the next step |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2515 # will eventually remove it. |
14219
c33427080671
revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
2516 heads[n] = True |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2517 # But, obviously its parents aren't. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2518 for p in self.parents(n): |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2519 heads.pop(p, None) |
49004
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
2520 heads = [head for head, flag in heads.items() if flag] |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2521 roots = list(roots) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2522 assert orderedout |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2523 assert roots |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2524 assert heads |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2525 return (orderedout, roots, heads) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2526 |
41275
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2527 def headrevs(self, revs=None): |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2528 if revs is None: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2529 try: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2530 return self.index.headrevs() |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2531 except AttributeError: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2532 return self._headrevs() |
47280
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47277
diff
changeset
|
2533 if rustdagop is not None and self.index.rust_ext_compat: |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
2534 return rustdagop.headrevs(self.index, revs) |
41772
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41700
diff
changeset
|
2535 return dagop.headrevs(revs, self._uncheckedparentrevs) |
17674
e69274f8d444
clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17673
diff
changeset
|
2536 |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
2537 def computephases(self, roots): |
25361
1635579f9baf
phases: fix bug where native phase computation wasn't called
Laurent Charignon <lcharignon@fb.com>
parents:
25113
diff
changeset
|
2538 return self.index.computephasesmapsets(roots) |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
2539 |
17674
e69274f8d444
clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17673
diff
changeset
|
2540 def _headrevs(self): |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2541 count = len(self) |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2542 if not count: |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2543 return [nullrev] |
17673
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2544 # we won't iter over filtered rev so nobody is a head at start |
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2545 ishead = [0] * (count + 1) |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2546 index = self.index |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
2547 for r in self: |
17673
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2548 ishead[r] = 1 # I may be an head |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2549 e = index[r] |
17673
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2550 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not |
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2551 return [r for r, val in enumerate(ishead) if val] |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2552 |
3923
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3755
diff
changeset
|
2553 def heads(self, start=None, stop=None): |
1550
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1535
diff
changeset
|
2554 """return the list of all nodes that have no children |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2555 |
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2556 if start is specified, only heads that are descendants of |
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2557 start will be returned |
3923
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3755
diff
changeset
|
2558 if stop is specified, it will consider all the revs from stop |
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3755
diff
changeset
|
2559 as if they had no children |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2560 """ |
4991
9c8c42bcf17a
revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents:
4990
diff
changeset
|
2561 if start is None and stop is None: |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2562 if not len(self): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2563 return [self.nullid] |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2564 return [self.node(r) for r in self.headrevs()] |
4991
9c8c42bcf17a
revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents:
4990
diff
changeset
|
2565 |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2566 if start is None: |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2567 start = nullrev |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2568 else: |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2569 start = self.rev(start) |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2570 |
44470
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44465
diff
changeset
|
2571 stoprevs = {self.rev(n) for n in stop or []} |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2572 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2573 revs = dagop.headrevssubset( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2574 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2575 ) |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2576 |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2577 return [self.node(rev) for rev in revs] |
370 | 2578 |
2579 def children(self, node): | |
1083 | 2580 """find the children of a given node""" |
370 | 2581 c = [] |
2582 p = self.rev(node) | |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
2583 for r in self.revs(start=p + 1): |
4746
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2584 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev] |
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2585 if prevs: |
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2586 for pr in prevs: |
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2587 if pr == p: |
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2588 c.append(self.node(r)) |
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2589 elif p == nullrev: |
62c56d8f368b
Fix revlog.children so the real children of the null revision can be calculated.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4635
diff
changeset
|
2590 c.append(self.node(r)) |
370 | 2591 return c |
515 | 2592 |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2593 def commonancestorsheads(self, a, b): |
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2594 """calculate all the heads of the common ancestors of nodes a and b""" |
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2595 a, b = self.rev(a), self.rev(b) |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2596 ancs = self._commonancestorsheads(a, b) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2597 return pycompat.maplist(self.node, ancs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2598 |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2599 def _commonancestorsheads(self, *revs): |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2600 """calculate all the heads of the common ancestors of revs""" |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2601 try: |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2602 ancs = self.index.commonancestorsheads(*revs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2603 except (AttributeError, OverflowError): # C implementation failed |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2604 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2605 return ancs |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2606 |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
2607 def isancestor(self, a, b): |
38664
160da69ba1bf
revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38663
diff
changeset
|
2608 """return True if node a is an ancestor of node b |
160da69ba1bf
revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38663
diff
changeset
|
2609 |
160da69ba1bf
revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38663
diff
changeset
|
2610 A revision is considered an ancestor of itself.""" |
38518
cc3543c87de5
revlog: reuse 'descendant' implemention in 'isancestor'
Boris Feld <boris.feld@octobus.net>
parents:
38517
diff
changeset
|
2611 a, b = self.rev(a), self.rev(b) |
38666
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2612 return self.isancestorrev(a, b) |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2613 |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2614 def isancestorrev(self, a, b): |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2615 """return True if revision a is an ancestor of revision b |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2616 |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2617 A revision is considered an ancestor of itself. |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2618 |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2619 The implementation of this is trivial but the use of |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2620 reachableroots is not.""" |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2621 if a == nullrev: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2622 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2623 elif a == b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2624 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2625 elif a > b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2626 return False |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2627 return bool(self.reachableroots(a, [b], [a], includepath=False)) |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2628 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2629 def reachableroots(self, minroot, heads, roots, includepath=False): |
43799
2e30d7df4809
revlog: fix revset in reachableroots docstring
Jun Wu <quark@fb.com>
parents:
43663
diff
changeset
|
2630 """return (heads(::(<roots> and <roots>::<heads>))) |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2631 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2632 If includepath is True, return (<roots>::<heads>).""" |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2633 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2634 return self.index.reachableroots2( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2635 minroot, heads, roots, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2636 ) |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2637 except AttributeError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2638 return dagop._reachablerootspure( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2639 self.parentrevs, minroot, roots, heads, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2640 ) |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
2641 |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2642 def ancestor(self, a, b): |
22389
94f77624dbb5
comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents:
22381
diff
changeset
|
2643 """calculate the "best" common ancestor of nodes a and b""" |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2644 |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
2645 a, b = self.rev(a), self.rev(b) |
18988
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2646 try: |
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2647 ancs = self.index.ancestors(a, b) |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2648 except (AttributeError, OverflowError): |
18988
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2649 ancs = ancestor.ancestors(self.parentrevs, a, b) |
18987
3605d4e7e618
revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents:
18986
diff
changeset
|
2650 if ancs: |
3605d4e7e618
revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents:
18986
diff
changeset
|
2651 # choose a consistent winner when there's a tie |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2652 return min(map(self.node, ancs)) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2653 return self.nullid |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
2654 |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2655 def _match(self, id): |
16762
93f8b9565257
revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents:
16686
diff
changeset
|
2656 if isinstance(id, int): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2657 # rev |
2641
156fb1feab62
lookup should allow -1 to represent nullid (if passed an int as arg)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2600
diff
changeset
|
2658 return self.node(id) |
47082
c5e1cc0b4c77
core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents:
47081
diff
changeset
|
2659 if len(id) == self.nodeconstants.nodelen: |
3438 | 2660 # possibly a binary node |
2661 # odds of a binary node being all hex in ASCII are 1 in 10**25 | |
2662 try: | |
2663 node = id | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2664 self.rev(node) # quick search the index |
3438 | 2665 return node |
39791
974592474dee
revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39790
diff
changeset
|
2666 except error.LookupError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2667 pass # may be partial hex id |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2668 try: |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2669 # str(rev) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2670 rev = int(id) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2671 if b"%d" % rev != id: |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2672 raise ValueError |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2673 if rev < 0: |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2674 rev = len(self) + rev |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2675 if rev < 0 or rev >= len(self): |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2676 raise ValueError |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2677 return self.node(rev) |
469 | 2678 except (ValueError, OverflowError): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2679 pass |
47081
a407fe56d6e8
core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents:
47079
diff
changeset
|
2680 if len(id) == 2 * self.nodeconstants.nodelen: |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2681 try: |
3438 | 2682 # a full hex nodeid? |
2683 node = bin(id) | |
7874
d812029cda85
cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7873
diff
changeset
|
2684 self.rev(node) |
3157
4fe41a9e4591
optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3156
diff
changeset
|
2685 return node |
49263
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
49262
diff
changeset
|
2686 except (binascii.Error, error.LookupError): |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2687 pass |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2688 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2689 def _partialmatch(self, id): |
37449
a0d71618074f
revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents:
37443
diff
changeset
|
2690 # we don't care wdirfilenodeids as they should be always full hash |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2691 maybewdir = self.nodeconstants.wdirhex.startswith(id) |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2692 ambiguous = False |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2693 try: |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2694 partial = self.index.partialmatch(id) |
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2695 if partial and self.hasnode(partial): |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2696 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2697 # single 'ff...' match in radix tree, ambiguous with wdir |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2698 ambiguous = True |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2699 else: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2700 return partial |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2701 elif maybewdir: |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2702 # no 'ff...' match in radix tree, wdir identified |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2703 raise error.WdirUnsupported |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2704 else: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2705 return None |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2706 except error.RevlogError: |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2707 # parsers.c radix tree lookup gave multiple matches |
29396
d0ae5b8f80dc
revlog: add a fast path for "ambiguous identifier"
Jun Wu <quark@fb.com>
parents:
29339
diff
changeset
|
2708 # fast path: for unfiltered changelog, radix tree is accurate |
d0ae5b8f80dc
revlog: add a fast path for "ambiguous identifier"
Jun Wu <quark@fb.com>
parents:
29339
diff
changeset
|
2709 if not getattr(self, 'filteredrevs', None): |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2710 ambiguous = True |
19471
fd1bb7c1be78
revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents:
19326
diff
changeset
|
2711 # fall through to slow path that filters hidden revisions |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2712 except (AttributeError, ValueError): |
49448
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2713 # we are pure python, or key is not hex |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2714 pass |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2715 if ambiguous: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2716 raise error.AmbiguousPrefixLookupError( |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2717 id, self.display_id, _(b'ambiguous identifier') |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2718 ) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2719 |
13258
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2720 if id in self._pcache: |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2721 return self._pcache[id] |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2722 |
37819
ee3d58b4a47f
revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents:
37767
diff
changeset
|
2723 if len(id) <= 40: |
49262
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2724 # hex(node)[:...] |
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2725 l = len(id) // 2 * 2 # grab an even number of digits |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2726 try: |
49448
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2727 # we're dropping the last digit, so let's check that it's hex, |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2728 # to avoid the expensive computation below if it's not |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2729 if len(id) % 2 > 0: |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2730 if not (id[-1] in hexdigits): |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2731 return None |
49261
31602d471b60
revlog: make round-down pattern clearer
Manuel Jacob <me@manueljacob.de>
parents:
49248
diff
changeset
|
2732 prefix = bin(id[:l]) |
49263
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
49262
diff
changeset
|
2733 except binascii.Error: |
49262
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2734 pass |
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2735 else: |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
2736 nl = [e[7] for e in self.index if e[7].startswith(prefix)] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2737 nl = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2738 n for n in nl if hex(n).startswith(id) and self.hasnode(n) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2739 ] |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2740 if self.nodeconstants.nullhex.startswith(id): |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2741 nl.append(self.nullid) |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2742 if len(nl) > 0: |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2743 if len(nl) == 1 and not maybewdir: |
13258
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2744 self._pcache[id] = nl[0] |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2745 return nl[0] |
39790
4a2466b2a434
revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39789
diff
changeset
|
2746 raise error.AmbiguousPrefixLookupError( |
47173
1ec64f59dc27
revlog: use revlog.display_id in ambiguity errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47172
diff
changeset
|
2747 id, self.display_id, _(b'ambiguous identifier') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2748 ) |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2749 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2750 raise error.WdirUnsupported |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2751 return None |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2752 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2753 def lookup(self, id): |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2754 """locate a node based on: |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2755 - revision number or str(revision number) |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2756 - nodeid or subset of hex nodeid |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2757 """ |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2758 n = self._match(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2759 if n is not None: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2760 return n |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2761 n = self._partialmatch(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2762 if n: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2763 return n |
515 | 2764 |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2765 raise error.LookupError(id, self.display_id, _(b'no match found')) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2766 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2767 def shortest(self, node, minlength=1): |
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2768 """Find the shortest unambiguous prefix that matches node.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2769 |
37907
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
2770 def isvalid(prefix): |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2771 try: |
42629
24111fb9a725
lookup: don't use "00changelog.i@None" when lookup of prefix fails
Martin von Zweigbergk <martinvonz@google.com>
parents:
42567
diff
changeset
|
2772 matchednode = self._partialmatch(prefix) |
39836
7a9e2d85f475
revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents:
39794
diff
changeset
|
2773 except error.AmbiguousPrefixLookupError: |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2774 return False |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2775 except error.WdirUnsupported: |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2776 # single 'ff...' match |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2777 return True |
42629
24111fb9a725
lookup: don't use "00changelog.i@None" when lookup of prefix fails
Martin von Zweigbergk <martinvonz@google.com>
parents:
42567
diff
changeset
|
2778 if matchednode is None: |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2779 raise error.LookupError(node, self.display_id, _(b'no node')) |
38014
76e933e0ccc9
shortest: remove unnecessary check for revnum in isvalid()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38013
diff
changeset
|
2780 return True |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2781 |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2782 def maybewdir(prefix): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2783 return all(c == b'f' for c in pycompat.iterbytestr(prefix)) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2784 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2785 hexnode = hex(node) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2786 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2787 def disambiguate(hexnode, minlength): |
38015
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
38014
diff
changeset
|
2788 """Disambiguate against wdirid.""" |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
2789 for length in range(minlength, len(hexnode) + 1): |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2790 prefix = hexnode[:length] |
38015
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
38014
diff
changeset
|
2791 if not maybewdir(prefix): |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2792 return prefix |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2793 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2794 if not getattr(self, 'filteredrevs', None): |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2795 try: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2796 length = max(self.index.shortest(node), minlength) |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2797 return disambiguate(hexnode, length) |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2798 except error.RevlogError: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2799 if node != self.nodeconstants.wdirid: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2800 raise error.LookupError( |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2801 node, self.display_id, _(b'no node') |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2802 ) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2803 except AttributeError: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2804 # Fall through to pure code |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2805 pass |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2806 |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2807 if node == self.nodeconstants.wdirid: |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
2808 for length in range(minlength, len(hexnode) + 1): |
38013
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2809 prefix = hexnode[:length] |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2810 if isvalid(prefix): |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2811 return prefix |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2812 |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
2813 for length in range(minlength, len(hexnode) + 1): |
37907
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
2814 prefix = hexnode[:length] |
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
2815 if isvalid(prefix): |
38013
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2816 return disambiguate(hexnode, length) |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2817 |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2818 def cmp(self, node, text): |
11539
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
2819 """compare text with a given file revision |
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
2820 |
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
2821 returns True if text is different than what is stored. |
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
2822 """ |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2823 p1, p2 = self.parents(node) |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
2824 return storageutil.hashrevisionsha1(text, p1, p2) != node |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2825 |
11929
1839a7518b0d
revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
11928
diff
changeset
|
2826 def deltaparent(self, rev): |
14195
0013d3eeb826
revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents:
14164
diff
changeset
|
2827 """return deltaparent of the given revision""" |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2828 base = self.index[rev][3] |
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2829 if base == rev: |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2830 return nullrev |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
2831 elif self.delta_config.general_delta: |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2832 return base |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2833 else: |
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2834 return rev - 1 |
11929
1839a7518b0d
revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
11928
diff
changeset
|
2835 |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
2836 def issnapshot(self, rev): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2837 """tells whether rev is a snapshot""" |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
2838 ret = self._inner.issnapshot(rev) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
2839 self.issnapshot = self._inner.issnapshot |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
2840 return ret |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
2841 |
39185
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2842 def snapshotdepth(self, rev): |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2843 """number of snapshot in the chain before this one""" |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2844 if not self.issnapshot(rev): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2845 raise error.ProgrammingError(b'revision %d not a snapshot') |
51099
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
2846 return len(self._inner._deltachain(rev)[0]) - 1 |
39185
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2847 |
1941
7518823709a2
revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1853
diff
changeset
|
2848 def revdiff(self, rev1, rev2): |
31758
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2849 """return or calculate a delta between two revisions |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2850 |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2851 The delta calculated is in binary form and is intended to be written to |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2852 revlog data directly. So this function needs raw revision data. |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2853 """ |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2854 if rev1 != nullrev and self.deltaparent(rev2) == rev1: |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
2855 return bytes(self._inner._chunk(rev2)) |
5005
72082bfced9a
revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents:
5004
diff
changeset
|
2856 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2857 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2)) |
119
c7a66f9752a4
Add code to retrieve or construct a revlog delta
mpm@selenic.com
parents:
117
diff
changeset
|
2858 |
51027
33d2f0164d0d
revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51025
diff
changeset
|
2859 def revision(self, nodeorrev): |
16435
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2860 """return an uncompressed revision of a given node or revision |
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2861 number. |
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2862 """ |
51027
33d2f0164d0d
revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51025
diff
changeset
|
2863 return self._revisiondata(nodeorrev) |
42735
389233789952
revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42711
diff
changeset
|
2864 |
51029
299b7b5440db
revlog: drop the df argument to `sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51028
diff
changeset
|
2865 def sidedata(self, nodeorrev): |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2866 """a map of extra data related to the changeset but not part of the hash |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2867 |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2868 This function currently return a dictionary. However, more advanced |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2869 mapping object will likely be used in the future for a more |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2870 efficient/lazy code. |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2871 """ |
47388
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2872 # deal with <nodeorrev> argument type |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2873 if isinstance(nodeorrev, int): |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2874 rev = nodeorrev |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2875 else: |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2876 rev = self.rev(nodeorrev) |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2877 return self._sidedata(rev) |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2878 |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2879 def _rawtext(self, node, rev): |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2880 """return the possibly unvalidated rawtext for a revision |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2881 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2882 returns (rev, rawtext, validated) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2883 """ |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2884 # Check if we have the entry in cache |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2885 # The cache entry looks like (node, rev, rawtext) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2886 if self._inner._revisioncache: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2887 if self._inner._revisioncache[0] == node: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2888 return (rev, self._inner._revisioncache[2], True) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2889 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2890 if rev is None: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2891 rev = self.rev(node) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2892 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2893 return self._inner.raw_text(node, rev) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2894 |
51031
8520db304f01
revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51030
diff
changeset
|
2895 def _revisiondata(self, nodeorrev, raw=False): |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
2896 # deal with <nodeorrev> argument type |
16375
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2897 if isinstance(nodeorrev, int): |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2898 rev = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2899 node = self.node(rev) |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2900 else: |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2901 node = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2902 rev = None |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2903 |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
2904 # fast path the special `nullid` rev |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2905 if node == self.nullid: |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2906 return b"" |
42805
bf070a59546a
revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42804
diff
changeset
|
2907 |
43984
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43962
diff
changeset
|
2908 # ``rawtext`` is the text as stored inside the revlog. Might be the |
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43962
diff
changeset
|
2909 # revision or might need to be processed to retrieve the revision. |
51031
8520db304f01
revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51030
diff
changeset
|
2910 rev, rawtext, validated = self._rawtext(node, rev) |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2911 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2912 if raw and validated: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2913 # if we don't want to process the raw text and that raw |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2914 # text is cached, we can exit early. |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2915 return rawtext |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2916 if rev is None: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2917 rev = self.rev(node) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2918 # the revlog's flag for this revision |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2919 # (usually alter its state or content) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2920 flags = self.flags(rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2921 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2922 if validated and flags == REVIDX_DEFAULT_FLAGS: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2923 # no extra flags set, no flag processor runs, text = rawtext |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2924 return rawtext |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2925 |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
2926 if raw: |
42994
dff95420480f
flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42993
diff
changeset
|
2927 validatehash = flagutil.processflagsraw(self, rawtext, flags) |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
2928 text = rawtext |
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
2929 else: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2930 r = flagutil.processflagsread(self, rawtext, flags) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2931 text, validatehash = r |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2932 if validatehash: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2933 self.checkhash(text, node, rev=rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2934 if not validated: |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2935 self._inner._revisioncache = (node, rev, rawtext) |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2936 |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2937 return text |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2938 |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2939 def _sidedata(self, rev): |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2940 """Return the sidedata for a given revision number.""" |
51102
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2941 sidedata_end = None |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2942 if self._docket is not None: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2943 sidedata_end = self._docket.sidedata_end |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2944 return self._inner.sidedata(rev, sidedata_end) |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2945 |
51028
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
2946 def rawdata(self, nodeorrev): |
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
2947 """return an uncompressed raw data of a given node or revision number.""" |
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
2948 return self._revisiondata(nodeorrev, raw=True) |
42736
415e4136d326
rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42735
diff
changeset
|
2949 |
22785
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2950 def hash(self, text, p1, p2): |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2951 """Compute a node hash. |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2952 |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2953 Available as a function so that subclasses can replace the hash |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2954 as needed. |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2955 """ |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
2956 return storageutil.hashrevisionsha1(text, p1, p2) |
22785
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2957 |
30589
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2958 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2959 """Check node hash integrity. |
19624
55749cb14d24
revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents:
19471
diff
changeset
|
2960 |
30589
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2961 Available as a function so that subclasses can extend hash mismatch |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2962 behaviors as needed. |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2963 """ |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2964 try: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2965 if p1 is None and p2 is None: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2966 p1, p2 = self.parents(node) |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2967 if node != self.hash(text, p1, p2): |
40055
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2968 # Clear the revision cache on hash failure. The revision cache |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2969 # only stores the raw revision and clearing the cache does have |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2970 # the side-effect that we won't have a cache hit when the raw |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2971 # revision data is accessed. But this case should be rare and |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2972 # it is extra work to teach the cache about the hash |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2973 # verification state. |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2974 if ( |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2975 self._inner._revisioncache |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2976 and self._inner._revisioncache[0] == node |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2977 ): |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2978 self._inner._revisioncache = None |
40055
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2979 |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2980 revornode = rev |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2981 if revornode is None: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2982 revornode = templatefilters.short(hex(node)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2983 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2984 _(b"integrity check failed on %s:%s") |
47174
0a66eef0ed97
revlog: use revlog.display_id in integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47173
diff
changeset
|
2985 % (self.display_id, pycompat.bytestr(revornode)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2986 ) |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2987 except error.RevlogError: |
51055
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
2988 if self.feature_config.censorable and storageutil.iscensoredtext( |
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
2989 text |
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
2990 ): |
47175
f574734eb2b7
revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
2991 raise error.CensoredNodeError(self.display_id, node, text) |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2992 raise |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2993 |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2994 @property |
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2995 def _split_index_file(self): |
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2996 """the path where to expect the index of an ongoing splitting operation |
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2997 |
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2998 The file will only exist if a splitting operation is in progress, but |
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2999 it is always expected at the same location.""" |
50761
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
3000 parts = self.radix.split(b'/') |
50391
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3001 if len(parts) > 1: |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3002 # adds a '-s' prefix to the ``data/` or `meta/` base |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3003 head = parts[0] + b'-s' |
50761
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
3004 mids = parts[1:-1] |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
3005 tail = parts[-1] + b'.i' |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
3006 pieces = [head] + mids + [tail] |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
3007 return b'/'.join(pieces) |
50391
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3008 else: |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3009 # the revlog is stored at the root of the store (changelog or |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3010 # manifest), no risk of collision. |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
3011 return self.radix + b'.i.s' |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
3012 |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3013 def _enforceinlinesize(self, tr, side_write=True): |
26376
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
3014 """Check if the revlog is too big for inline and convert if so. |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
3015 |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
3016 This should be called after revisions are added to the revlog. If the |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
3017 revlog has grown too large to be an inline revlog, it will convert it |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
3018 to use multiple index and data files. |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
3019 """ |
38883
119d14f41cb2
revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents:
38880
diff
changeset
|
3020 tiprev = len(self) - 1 |
47181
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47180
diff
changeset
|
3021 total_size = self.start(tiprev) + self.length(tiprev) |
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47180
diff
changeset
|
3022 if not self._inline or total_size < _maxinline: |
2073 | 3023 return |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
3024 |
51092
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
3025 if self._docket is not None: |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
3026 msg = b"inline revlog should not have a docket" |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
3027 raise error.ProgrammingError(msg) |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
3028 |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
3029 troffset = tr.findoffset(self._inner.canonical_index_file) |
45885
a6f08085edfe
transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents:
45884
diff
changeset
|
3030 if troffset is None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3031 raise error.RevlogError( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3032 _(b"%s not found in the transaction") % self._indexfile |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3033 ) |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3034 if troffset: |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
3035 tr.addbackup(self._inner.canonical_index_file, for_offset=True) |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3036 tr.add(self._datafile, 0) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
3037 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3038 new_index_file_path = None |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3039 if side_write: |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3040 old_index_file_path = self._indexfile |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
3041 new_index_file_path = self._split_index_file |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3042 opener = self.opener |
50348
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3043 weak_self = weakref.ref(self) |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3044 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3045 # the "split" index replace the real index when the transaction is |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3046 # finalized |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3047 def finalize_callback(tr): |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3048 opener.rename( |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3049 new_index_file_path, |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3050 old_index_file_path, |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3051 checkambig=True, |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3052 ) |
50348
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3053 maybe_self = weak_self() |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3054 if maybe_self is not None: |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3055 maybe_self._indexfile = old_index_file_path |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3056 maybe_self._inner.index_file = maybe_self._indexfile |
50348
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3057 |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3058 def abort_callback(tr): |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3059 maybe_self = weak_self() |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3060 if maybe_self is not None: |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3061 maybe_self._indexfile = old_index_file_path |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3062 maybe_self._inner.inline = True |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3063 maybe_self._inner.index_file = old_index_file_path |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3064 |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3065 tr.registertmp(new_index_file_path) |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3066 if self.target[1] is not None: |
50348
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3067 callback_id = b'000-revlog-split-%d-%s' % self.target |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
3068 else: |
50348
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3069 callback_id = b'000-revlog-split-%d' % self.target[0] |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3070 tr.addfinalize(callback_id, finalize_callback) |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
3071 tr.addabort(callback_id, abort_callback) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
3072 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3073 self._format_flags &= ~FLAG_INLINE_DATA |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3074 self._inner.split_inline( |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3075 tr, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3076 self._format_flags | self._format_version, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3077 new_index_file_path=new_index_file_path, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3078 ) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3079 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3080 self._inline = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3081 if new_index_file_path is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3082 self._indexfile = new_index_file_path |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3083 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
3084 nodemaputil.setup_persistent_nodemap(tr, self) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3085 |
39891
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39886
diff
changeset
|
3086 def _nodeduplicatecallback(self, transaction, node): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
3087 """called when trying to add a node already stored.""" |
39891
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39886
diff
changeset
|
3088 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3089 @contextlib.contextmanager |
47469
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47463
diff
changeset
|
3090 def reading(self): |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3091 with self._inner.reading(): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3092 yield |
47469
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47463
diff
changeset
|
3093 |
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47463
diff
changeset
|
3094 @contextlib.contextmanager |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3095 def _writing(self, transaction): |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
3096 if self._trypending: |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
3097 msg = b'try to write in a `trypending` revlog: %s' |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
3098 msg %= self.display_id |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
3099 raise error.ProgrammingError(msg) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3100 if self._inner.is_writing: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3101 yield |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3102 else: |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3103 data_end = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3104 sidedata_end = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3105 if self._docket is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3106 data_end = self._docket.data_end |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3107 sidedata_end = self._docket.sidedata_end |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3108 with self._inner.writing( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3109 transaction, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3110 data_end=data_end, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3111 sidedata_end=sidedata_end, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3112 ): |
47335
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47332
diff
changeset
|
3113 yield |
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47332
diff
changeset
|
3114 if self._docket is not None: |
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47332
diff
changeset
|
3115 self._write_docket(transaction) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3116 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
3117 @property |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
3118 def is_delaying(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
3119 return self._inner.is_delaying |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3120 |
47250
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3121 def _write_docket(self, transaction): |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3122 """write the current docket on disk |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3123 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3124 Exist as a method to help changelog to implement transaction logic |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3125 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3126 We could also imagine using the same transaction logic for all revlog |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3127 since docket are cheap.""" |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3128 self._docket.write(transaction) |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3129 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3130 def addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3131 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3132 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3133 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3134 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3135 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3136 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3137 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3138 node=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3139 flags=REVIDX_DEFAULT_FLAGS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3140 deltacomputer=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3141 sidedata=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3142 ): |
1083 | 3143 """add a revision to the log |
3144 | |
3145 text - the revision data to add | |
3146 transaction - the transaction object used for rollback | |
3147 link - the linkrev data to add | |
3148 p1, p2 - the parent nodeids of the revision | |
12012
bade7a9c5c07
revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12011
diff
changeset
|
3149 cachedelta - an optional precomputed delta |
19625
6a411a06cb1f
revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents:
19624
diff
changeset
|
3150 node - nodeid of revision; typically node is not specified, and it is |
6a411a06cb1f
revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents:
19624
diff
changeset
|
3151 computed by default as hash(text, p1, p2), however subclasses might |
6a411a06cb1f
revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents:
19624
diff
changeset
|
3152 use different hashing method (and override checkhash() in such case) |
30744
e12c0fa1f65b
revlog: pass revlog flags to addrevision
Remi Chaintron <remi@fb.com>
parents:
30743
diff
changeset
|
3153 flags - the known flags to set on the revision |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
3154 deltacomputer - an optional deltacomputer instance shared between |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3155 multiple calls |
1083 | 3156 """ |
19326
7014526d67a8
revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents:
19200
diff
changeset
|
3157 if link == nullrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3158 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3159 _(b"attempted to add linkrev -1 to %s") % self.display_id |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3160 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
3161 |
42988
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
3162 if sidedata is None: |
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
3163 sidedata = {} |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
3164 elif sidedata and not self.feature_config.has_side_data: |
43030
827cb4fe62a3
sidedata: introduce a new requirement to protect the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43027
diff
changeset
|
3165 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3166 _(b"trying to add sidedata to a revlog who don't support them") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3167 ) |
42988
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
3168 |
30745 | 3169 if flags: |
3170 node = node or self.hash(text, p1, p2) | |
3171 | |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3172 rawtext, validatehash = flagutil.processflagswrite(self, text, flags) |
30745 | 3173 |
3174 # If the flag processor modifies the revision data, ignore any provided | |
3175 # cachedelta. | |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3176 if rawtext != text: |
30745 | 3177 cachedelta = None |
3178 | |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3179 if len(rawtext) > _maxentrysize: |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
3180 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3181 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3182 b"%s: size of %d bytes exceeds maximum revlog storage of 2GiB" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3183 ) |
47176
dfe8074239de
revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47175
diff
changeset
|
3184 % (self.display_id, len(rawtext)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3185 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
3186 |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3187 node = node or self.hash(rawtext, p1, p2) |
46560
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3188 rev = self.index.get_rev(node) |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3189 if rev is not None: |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3190 return rev |
12023
44c22dc193a4
revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12012
diff
changeset
|
3191 |
30745 | 3192 if validatehash: |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3193 self.checkhash(rawtext, node, p1=p1, p2=p2) |
30745 | 3194 |
46560
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3195 return self.addrawrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3196 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3197 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3198 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3199 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3200 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3201 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3202 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3203 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3204 deltacomputer=deltacomputer, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3205 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3206 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3207 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3208 def addrawrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3209 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3210 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3211 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3212 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3213 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3214 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3215 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3216 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3217 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3218 deltacomputer=None, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3219 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3220 ): |
32284
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3221 """add a raw revision with known flags, node and parents |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3222 useful when reusing a revision not stored in this revlog (ex: received |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3223 over wire, or read from an external bundle). |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3224 """ |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3225 with self._writing(transaction): |
46559
9ee4e988e2be
revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46558
diff
changeset
|
3226 return self._addrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3227 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3228 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3229 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3230 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3231 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3232 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3233 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3234 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3235 deltacomputer=deltacomputer, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3236 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3237 ) |
3390
a74addddd092
make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3360
diff
changeset
|
3238 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
3239 def compress(self, data): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
3240 return self._inner.compress(data) |
17128
1028a1c9077a
revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents:
17009
diff
changeset
|
3241 |
30793
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
3242 def decompress(self, data): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
3243 return self._inner.decompress(data) |
30793
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
3244 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3245 def _addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3246 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3247 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3248 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3249 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3250 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3251 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3252 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3253 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3254 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3255 alwayscache=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3256 deltacomputer=None, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3257 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3258 ): |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3259 """internal function to add revisions to the log |
12623
8f97b50a8d10
revlog._addrevision(): allow text argument to be None, build it lazily
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12336
diff
changeset
|
3260 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3261 see addrevision for argument descriptions. |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3262 |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3263 note: "addrevision" takes non-raw text, "_addrevision" takes raw text. |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3264 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3265 if "deltacomputer" is not provided or None, a defaultdeltacomputer will |
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3266 be used. |
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3267 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3268 invariants: |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3269 - rawtext is optional (can be None); if not set, cachedelta must be set. |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17150
diff
changeset
|
3270 if both are set, they must correspond to each other. |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3271 """ |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3272 if node == self.nullid: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3273 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3274 _(b"%s: attempt to add null revision") % self.display_id |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3275 ) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3276 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3277 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3278 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3279 ): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3280 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3281 _(b"%s: attempt to add wdir revision") % self.display_id |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3282 ) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3283 if self._inner._writinghandles is None: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3284 msg = b'adding revision outside `revlog._writing` context' |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3285 raise error.ProgrammingError(msg) |
34045
bfb38c5cebf4
revlog: move check for wdir from changelog to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
34044
diff
changeset
|
3286 |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3287 btext = [rawtext] |
12623
8f97b50a8d10
revlog._addrevision(): allow text argument to be None, build it lazily
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12336
diff
changeset
|
3288 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3289 curr = len(self) |
4981
e7131935fbb3
revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents:
4980
diff
changeset
|
3290 prev = curr - 1 |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3291 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3292 offset = self._get_data_offset(prev) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3293 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3294 if self._concurrencychecker: |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3295 ifh, dfh, sdfh = self._inner._writinghandles |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3296 # XXX no checking for the sidedata file |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3297 if self._inline: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3298 # offset is "as if" it were in the .d file, so we need to add on |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3299 # the size of the entry metadata. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3300 self._concurrencychecker( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3301 ifh, self._indexfile, offset + curr * self.index.entry_size |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3302 ) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3303 else: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3304 # Entries in the .i are a consistent size. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3305 self._concurrencychecker( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3306 ifh, self._indexfile, curr * self.index.entry_size |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3307 ) |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3308 self._concurrencychecker(dfh, self._datafile, offset) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3309 |
12889
5482c6b826f4
revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents:
12888
diff
changeset
|
3310 p1r, p2r = self.rev(p1), self.rev(p2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
3311 |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3312 # full versions are inserted when the needed deltas |
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3313 # become comparable to the uncompressed text |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3314 if rawtext is None: |
35841
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
3315 # need rawtext size, before changed by flag processors, which is |
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
3316 # the non-raw size. use revlog explicitly to avoid filelog's extra |
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
3317 # logic that might remove metadata size. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3318 textlen = mdiff.patchedsize( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3319 revlog.size(self, cachedelta[0]), cachedelta[1] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3320 ) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3321 else: |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3322 textlen = len(rawtext) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3323 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3324 if deltacomputer is None: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3325 write_debug = None |
51059
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51056
diff
changeset
|
3326 if self.delta_config.debug_delta: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3327 write_debug = transaction._report |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3328 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3329 self, write_debug=write_debug |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3330 ) |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3331 |
49791
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3332 if cachedelta is not None and len(cachedelta) == 2: |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3333 # If the cached delta has no information about how it should be |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3334 # reused, add the default reuse instruction according to the |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3335 # revlog's configuration. |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3336 if ( |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3337 self.delta_config.general_delta |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3338 and self.delta_config.lazy_delta_base |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3339 ): |
49791
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3340 delta_base_reuse = DELTA_BASE_REUSE_TRY |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3341 else: |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3342 delta_base_reuse = DELTA_BASE_REUSE_NO |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3343 cachedelta = (cachedelta[0], cachedelta[1], delta_base_reuse) |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3344 |
47405
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3345 revinfo = revlogutils.revisioninfo( |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3346 node, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3347 p1, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3348 p2, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3349 btext, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3350 textlen, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3351 cachedelta, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3352 flags, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3353 ) |
35840
33275ab5e837
revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents:
35839
diff
changeset
|
3354 |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3355 deltainfo = deltacomputer.finddeltainfo(revinfo) |
35634
b43578ec483a
revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents:
35525
diff
changeset
|
3356 |
47264
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
3357 compression_mode = COMP_MODE_INLINE |
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
3358 if self._docket is not None: |
47458
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47456
diff
changeset
|
3359 default_comp = self._docket.default_compression_header |
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47456
diff
changeset
|
3360 r = deltautil.delta_compression(default_comp, deltainfo) |
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47456
diff
changeset
|
3361 compression_mode, deltainfo = r |
47264
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
3362 |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
3363 sidedata_compression_mode = COMP_MODE_INLINE |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
3364 if sidedata and self.feature_config.has_side_data: |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
3365 sidedata_compression_mode = COMP_MODE_PLAIN |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3366 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata) |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3367 sidedata_offset = self._docket.sidedata_end |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
3368 h, comp_sidedata = self._inner.compress(serialized_sidedata) |
47269
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3369 if ( |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3370 h != b'u' |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3371 and comp_sidedata[0:1] != b'\0' |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3372 and len(comp_sidedata) < len(serialized_sidedata) |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3373 ): |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3374 assert not h |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3375 if ( |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3376 comp_sidedata[0:1] |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3377 == self._docket.default_compression_header |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3378 ): |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3379 sidedata_compression_mode = COMP_MODE_DEFAULT |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3380 serialized_sidedata = comp_sidedata |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3381 else: |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3382 sidedata_compression_mode = COMP_MODE_INLINE |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3383 serialized_sidedata = comp_sidedata |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3384 else: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3385 serialized_sidedata = b"" |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3386 # Don't store the offset if the sidedata is empty, that way |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3387 # we can easily detect empty sidedata and they will be no different |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3388 # than ones we manually add. |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3389 sidedata_offset = 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3390 |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
3391 rank = RANK_UNKNOWN |
51069
81f3877372c3
revlog: remove legacy usage of `_compute_rank`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51066
diff
changeset
|
3392 if self.feature_config.compute_rank: |
48768
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3393 if (p1r, p2r) == (nullrev, nullrev): |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3394 rank = 1 |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3395 elif p1r != nullrev and p2r == nullrev: |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3396 rank = 1 + self.fast_rank(p1r) |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3397 elif p1r == nullrev and p2r != nullrev: |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3398 rank = 1 + self.fast_rank(p2r) |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3399 else: # merge node |
48946
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3400 if rustdagop is not None and self.index.rust_ext_compat: |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3401 rank = rustdagop.rank(self.index, p1r, p2r) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3402 else: |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3403 pmin, pmax = sorted((p1r, p2r)) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3404 rank = 1 + self.fast_rank(pmax) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3405 rank += sum(1 for _ in self.findmissingrevs([pmax], [pmin])) |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
3406 |
47402
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3407 e = revlogutils.entry( |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3408 flags=flags, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3409 data_offset=offset, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3410 data_compressed_length=deltainfo.deltalen, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3411 data_uncompressed_length=textlen, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3412 data_compression_mode=compression_mode, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3413 data_delta_base=deltainfo.base, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3414 link_rev=link, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3415 parent_rev_1=p1r, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3416 parent_rev_2=p2r, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3417 node_id=node, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3418 sidedata_offset=sidedata_offset, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3419 sidedata_compressed_length=len(serialized_sidedata), |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3420 sidedata_compression_mode=sidedata_compression_mode, |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
3421 rank=rank, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3422 ) |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46646
diff
changeset
|
3423 |
38889
6104b203bec8
index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38888
diff
changeset
|
3424 self.index.append(e) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
3425 entry = self.index.entry_binary(curr) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
3426 if curr == 0 and self._docket is None: |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3427 header = self._format_flags | self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3428 header = self.index.pack_header(header) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
3429 entry = header + entry |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3430 self._writeentry( |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3431 transaction, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3432 entry, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3433 deltainfo.data, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3434 link, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3435 offset, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3436 serialized_sidedata, |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3437 sidedata_offset, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3438 ) |
39360
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
3439 |
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
3440 rawtext = btext[0] |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
3441 |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3442 if alwayscache and rawtext is None: |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3443 rawtext = deltacomputer.buildtext(revinfo) |
26243
836291420d53
revlog: optionally cache the full text when adding revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26242
diff
changeset
|
3444 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3445 if type(rawtext) == bytes: # only accept immutable objects |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
3446 self._inner._revisioncache = (node, curr, rawtext) |
39360
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
3447 self._chainbasecache[curr] = deltainfo.chainbase |
46558
07984507d553
revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46530
diff
changeset
|
3448 return curr |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
3449 |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3450 def _get_data_offset(self, prev): |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3451 """Returns the current offset in the (in-transaction) data file. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3452 Versions < 2 of the revlog can get this 0(1), revlog v2 needs a docket |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3453 file to store that information: since sidedata can be rewritten to the |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3454 end of the data file within a transaction, you can have cases where, for |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3455 example, rev `n` does not have sidedata while rev `n - 1` does, leading |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3456 to `n - 1`'s sidedata being written after `n`'s data. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3457 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3458 TODO cache this in a docket file before getting out of experimental.""" |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3459 if self._docket is None: |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3460 return self.end(prev) |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3461 else: |
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3462 return self._docket.data_end |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3463 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3464 def _writeentry( |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3465 self, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3466 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3467 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3468 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3469 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3470 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3471 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3472 sidedata_offset, |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3473 ): |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3474 # Files opened in a+ mode have inconsistent behavior on various |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3475 # platforms. Windows requires that a file positioning call be made |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3476 # when the file handle transitions between reads and writes. See |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3477 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3478 # platforms, Python or the platform itself can be buggy. Some versions |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3479 # of Solaris have been observed to not append at the end of the file |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3480 # if the file was seeked to before the end. See issue4943 for more. |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3481 # |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3482 # We work around this issue by inserting a seek() before writing. |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3483 # Note: This is likely not necessary on Python 3. However, because |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3484 # the file handle is reused for reads and may be seeked there, we need |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3485 # to be careful before changing this. |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3486 index_end = data_end = sidedata_end = None |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3487 if self._docket is not None: |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3488 index_end = self._docket.index_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3489 data_end = self._docket.data_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3490 sidedata_end = self._docket.sidedata_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3491 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3492 files_end = self._inner.write_entry( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3493 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3494 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3495 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3496 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3497 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3498 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3499 sidedata_offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3500 index_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3501 data_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3502 sidedata_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3503 ) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3504 self._enforceinlinesize(transaction) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3505 if self._docket is not None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3506 self._docket.index_end = files_end[0] |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3507 self._docket.data_end = files_end[1] |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3508 self._docket.sidedata_end = files_end[2] |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3509 |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
3510 nodemaputil.setup_persistent_nodemap(transaction, self) |
2073 | 3511 |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3512 def addgroup( |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3513 self, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3514 deltas, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3515 linkmapper, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3516 transaction, |
46445
711ba0f1057e
revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents:
46310
diff
changeset
|
3517 alwayscache=False, |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3518 addrevisioncb=None, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3519 duplicaterevisioncb=None, |
49739
35d4c2124073
debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49738
diff
changeset
|
3520 debug_info=None, |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3521 delta_base_reuse_policy=None, |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3522 ): |
1083 | 3523 """ |
3524 add a delta group | |
46 | 3525 |
1083 | 3526 given a set of deltas, add them to the revision log. the |
3527 first delta is against its parent, which should be in our | |
3528 log, the rest are against the previous delta. | |
25822
00e3f909907f
revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
3529 |
00e3f909907f
revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
3530 If ``addrevisioncb`` is defined, it will be called with arguments of |
00e3f909907f
revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
3531 this revlog and the node that was added. |
1083 | 3532 """ |
3533 | |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3534 if self._adding_group: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3535 raise error.ProgrammingError(b'cannot nest addgroup() calls') |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3536 |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3537 # read the default delta-base reuse policy from revlog config if the |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3538 # group did not specify one. |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3539 if delta_base_reuse_policy is None: |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3540 if ( |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3541 self.delta_config.general_delta |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3542 and self.delta_config.lazy_delta_base |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3543 ): |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3544 delta_base_reuse_policy = DELTA_BASE_REUSE_TRY |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3545 else: |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3546 delta_base_reuse_policy = DELTA_BASE_REUSE_NO |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3547 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3548 self._adding_group = True |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3549 empty = True |
6261
7c8101b5ceb1
revlog: make sure the files are closed after an exception happens
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6228
diff
changeset
|
3550 try: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3551 with self._writing(transaction): |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3552 write_debug = None |
51059
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51056
diff
changeset
|
3553 if self.delta_config.debug_delta: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3554 write_debug = transaction._report |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3555 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3556 self, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3557 write_debug=write_debug, |
49739
35d4c2124073
debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49738
diff
changeset
|
3558 debug_info=debug_info, |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3559 ) |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3560 # loop through our set of deltas |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3561 for data in deltas: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3562 ( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3563 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3564 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3565 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3566 linknode, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3567 deltabase, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3568 delta, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3569 flags, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3570 sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3571 ) = data |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3572 link = linkmapper(linknode) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3573 flags = flags or REVIDX_DEFAULT_FLAGS |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3574 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3575 rev = self.index.get_rev(node) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3576 if rev is not None: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3577 # this can happen if two branches make the same change |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3578 self._nodeduplicatecallback(transaction, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3579 if duplicaterevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3580 duplicaterevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3581 empty = False |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3582 continue |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3583 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3584 for p in (p1, p2): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3585 if not self.index.has_node(p): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3586 raise error.LookupError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3587 p, self.radix, _(b'unknown parent') |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3588 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3589 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3590 if not self.index.has_node(deltabase): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3591 raise error.LookupError( |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3592 deltabase, self.display_id, _(b'unknown delta base') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3593 ) |
24120
a450e0a2ba0a
revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents:
24118
diff
changeset
|
3594 |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3595 baserev = self.rev(deltabase) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3596 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3597 if baserev != nullrev and self.iscensored(baserev): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3598 # if base is censored, delta must be full replacement in a |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3599 # single patch operation |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3600 hlen = struct.calcsize(b">lll") |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3601 oldlen = self.rawsize(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3602 newlen = len(delta) - hlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3603 if delta[:hlen] != mdiff.replacediffheader( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3604 oldlen, newlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3605 ): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3606 raise error.CensoredBaseError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3607 self.display_id, self.node(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3608 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3609 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3610 if not flags and self._peek_iscensored(baserev, delta): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3611 flags |= REVIDX_ISCENSORED |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3612 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3613 # We assume consumers of addrevisioncb will want to retrieve |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3614 # the added revision, which will require a call to |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3615 # revision(). revision() will fast path if there is a cache |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3616 # hit. So, we tell _addrevision() to always cache in this case. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3617 # We're only using addgroup() in the context of changegroup |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3618 # generation so the revision data can always be handled as raw |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3619 # by the flagprocessor. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3620 rev = self._addrevision( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3621 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3622 None, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3623 transaction, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3624 link, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3625 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3626 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3627 flags, |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3628 (baserev, delta, delta_base_reuse_policy), |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3629 alwayscache=alwayscache, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3630 deltacomputer=deltacomputer, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3631 sidedata=sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3632 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3633 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3634 if addrevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3635 addrevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3636 empty = False |
6261
7c8101b5ceb1
revlog: make sure the files are closed after an exception happens
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6228
diff
changeset
|
3637 finally: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3638 self._adding_group = False |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3639 return not empty |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3640 |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3641 def iscensored(self, rev): |
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3642 """Check if a file revision is censored.""" |
51055
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
3643 if not self.feature_config.censorable: |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3644 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3645 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3646 return self.flags(rev) & REVIDX_ISCENSORED |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3647 |
47180
c9ae2e7fe154
revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47179
diff
changeset
|
3648 def _peek_iscensored(self, baserev, delta): |
24255
4bfe9f2d9761
revlog: addgroup checks if incoming deltas add censored revs, sets flag bit
Mike Edgar <adgar@google.com>
parents:
24123
diff
changeset
|
3649 """Quickly check if a delta produces a censored revision.""" |
51055
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
3650 if not self.feature_config.censorable: |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3651 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3652 |
40325
b0fbd1792e2d
storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40298
diff
changeset
|
3653 return storageutil.deltaiscensored(delta, baserev, self.rawsize) |
24255
4bfe9f2d9761
revlog: addgroup checks if incoming deltas add censored revs, sets flag bit
Mike Edgar <adgar@google.com>
parents:
24123
diff
changeset
|
3654 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3655 def getstrippoint(self, minlink): |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3656 """find the minimum rev that must be stripped to strip the linkrev |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3657 |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3658 Returns a tuple containing the minimum rev and a set of all revs that |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3659 have linkrevs that will be broken by this strip. |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3660 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3661 return storageutil.resolvestripinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3662 minlink, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3663 len(self) - 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3664 self.headrevs(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3665 self.linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3666 self.parentrevs, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3667 ) |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3668 |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8017
diff
changeset
|
3669 def strip(self, minlink, transaction): |
5910
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3670 """truncate the revlog on the first revision with a linkrev >= minlink |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3671 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3672 This function is called when we're stripping revision minlink and |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3673 its descendants from the repository. |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3674 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3675 We have to remove all revisions with linkrev >= minlink, because |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3676 the equivalent changelog revisions will be renumbered after the |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3677 strip. |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3678 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3679 So we truncate the revlog on the first of these revisions, and |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3680 trust that the caller has saved the revisions that shouldn't be |
15827
1dacf7672556
revlog: clarify strip docstring "readd" -> "re-add"
Steven Brown <StevenGBrown@gmail.com>
parents:
15407
diff
changeset
|
3681 removed and that it'll re-add them after this truncation. |
5910
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3682 """ |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3683 if len(self) == 0: |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3684 return |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3685 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3686 rev, _ = self.getstrippoint(minlink) |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3687 if rev == len(self): |
5909
f45f7390c1c5
strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5659
diff
changeset
|
3688 return |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3689 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3690 # first truncate the files on disk |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3691 data_end = self.start(rev) |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
3692 if not self._inline: |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3693 transaction.add(self._datafile, data_end) |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46859
diff
changeset
|
3694 end = rev * self.index.entry_size |
2073 | 3695 else: |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3696 end = data_end + (rev * self.index.entry_size) |
2072 | 3697 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3698 if self._sidedatafile: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3699 sidedata_end = self.sidedata_cut_off(rev) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3700 transaction.add(self._sidedatafile, sidedata_end) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3701 |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3702 transaction.add(self._indexfile, end) |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3703 if self._docket is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3704 # XXX we could, leverage the docket while stripping. However it is |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3705 # not powerfull enough at the time of this comment |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3706 self._docket.index_end = end |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3707 self._docket.data_end = data_end |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3708 self._docket.sidedata_end = sidedata_end |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3709 self._docket.write(transaction, stripping=True) |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3710 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3711 # then reset internal state in memory to forget those revisions |
45802
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
3712 self._chaininfocache = util.lrucachedict(500) |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
3713 self._inner.clear_cache() |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3714 |
4979
06abdaf78788
revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents:
4978
diff
changeset
|
3715 del self.index[rev:-1] |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3716 |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3717 def checksize(self): |
41877
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3718 """Check size of index and data files |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3719 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3720 return a (dd, di) tuple. |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3721 - dd: extra bytes for the "data" file |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3722 - di: extra bytes for the "index" file |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3723 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3724 A healthy revlog will return (0, 0). |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3725 """ |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3726 expected = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3727 if len(self): |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3728 expected = max(0, self.end(len(self) - 1)) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3729 |
1494
249ca10d37f4
Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
3730 try: |
36011
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
36010
diff
changeset
|
3731 with self._datafp() as f: |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
3732 f.seek(0, io.SEEK_END) |
36011
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
36010
diff
changeset
|
3733 actual = f.tell() |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3734 dd = actual - expected |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
3735 except FileNotFoundError: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3736 dd = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3737 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3738 try: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3739 f = self.opener(self._indexfile) |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
3740 f.seek(0, io.SEEK_END) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3741 actual = f.tell() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13284
diff
changeset
|
3742 f.close() |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46859
diff
changeset
|
3743 s = self.index.entry_size |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8658
diff
changeset
|
3744 i = max(0, actual // s) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3745 di = actual - (i * s) |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
3746 if self._inline: |
2073 | 3747 databytes = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3748 for r in self: |
5312
fb070713ff36
revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents:
5007
diff
changeset
|
3749 databytes += max(0, self.length(r)) |
2073 | 3750 dd = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3751 di = actual - len(self) * s - databytes |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
3752 except FileNotFoundError: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3753 di = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3754 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3755 return (dd, di) |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3756 |
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3757 def files(self): |
51086
808f1e38cd1d
revlog: small doc to the `files` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51085
diff
changeset
|
3758 """return list of files that compose this revlog""" |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3759 res = [self._indexfile] |
47456
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3760 if self._docket_file is None: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3761 if not self._inline: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3762 res.append(self._datafile) |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3763 else: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3764 res.append(self._docket_file) |
47461
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47458
diff
changeset
|
3765 res.extend(self._docket.old_index_filepaths(include_empty=False)) |
47456
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3766 if self._docket.data_end: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3767 res.append(self._datafile) |
47461
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47458
diff
changeset
|
3768 res.extend(self._docket.old_data_filepaths(include_empty=False)) |
47456
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3769 if self._docket.sidedata_end: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3770 res.append(self._sidedatafile) |
47461
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47458
diff
changeset
|
3771 res.extend(self._docket.old_sidedata_filepaths(include_empty=False)) |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3772 return res |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3773 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3774 def emitrevisions( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3775 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3776 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3777 nodesorder=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3778 revisiondata=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3779 assumehaveparentrevisions=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3780 deltamode=repository.CG_DELTAMODE_STD, |
46728
45f0d5297698
changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46725
diff
changeset
|
3781 sidedata_helpers=None, |
49738
9cac281eb9c0
debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49712
diff
changeset
|
3782 debug_info=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3783 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3784 if nodesorder not in (b'nodes', b'storage', b'linear', None): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3785 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3786 b'unhandled value for nodesorder: %s' % nodesorder |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3787 ) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
3788 |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3789 if nodesorder is None and not self.delta_config.general_delta: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3790 nodesorder = b'storage' |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
3791 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3792 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3793 not self._storedeltachains |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3794 and deltamode != repository.CG_DELTAMODE_PREV |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3795 ): |
40495
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3796 deltamode = repository.CG_DELTAMODE_FULL |
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3797 |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3798 return storageutil.emitrevisions( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3799 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3800 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3801 nodesorder, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3802 revlogrevisiondelta, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3803 deltaparentfn=self.deltaparent, |
51009
39fa0b948f5a
revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51008
diff
changeset
|
3804 candeltafn=self._candelta, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3805 rawsizefn=self.rawsize, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3806 revdifffn=self.revdiff, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3807 flagsfn=self.flags, |
40495
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3808 deltamode=deltamode, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3809 revisiondata=revisiondata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3810 assumehaveparentrevisions=assumehaveparentrevisions, |
46728
45f0d5297698
changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46725
diff
changeset
|
3811 sidedata_helpers=sidedata_helpers, |
49738
9cac281eb9c0
debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49712
diff
changeset
|
3812 debug_info=debug_info, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3813 ) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
3814 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3815 DELTAREUSEALWAYS = b'always' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3816 DELTAREUSESAMEREVS = b'samerevs' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3817 DELTAREUSENEVER = b'never' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3818 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3819 DELTAREUSEFULLADD = b'fulladd' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3820 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3821 DELTAREUSEALL = {b'always', b'samerevs', b'never', b'fulladd'} |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3822 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3823 def clone( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3824 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3825 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3826 destrevlog, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3827 addrevisioncb=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3828 deltareuse=DELTAREUSESAMEREVS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3829 forcedeltabothparents=None, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3830 sidedata_helpers=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3831 ): |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3832 """Copy this revlog to another, possibly with format changes. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3833 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3834 The destination revlog will contain the same revisions and nodes. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3835 However, it may not be bit-for-bit identical due to e.g. delta encoding |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3836 differences. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3837 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3838 The ``deltareuse`` argument control how deltas from the existing revlog |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3839 are preserved in the destination revlog. The argument can have the |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3840 following values: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3841 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3842 DELTAREUSEALWAYS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3843 Deltas will always be reused (if possible), even if the destination |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3844 revlog would not select the same revisions for the delta. This is the |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3845 fastest mode of operation. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3846 DELTAREUSESAMEREVS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3847 Deltas will be reused if the destination revlog would pick the same |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3848 revisions for the delta. This mode strikes a balance between speed |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3849 and optimization. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3850 DELTAREUSENEVER |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3851 Deltas will never be reused. This is the slowest mode of execution. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3852 This mode can be used to recompute deltas (e.g. if the diff/delta |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3853 algorithm changes). |
42999
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3854 DELTAREUSEFULLADD |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3855 Revision will be re-added as if their were new content. This is |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3856 slower than DELTAREUSEALWAYS but allow more mechanism to kicks in. |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3857 eg: large file detection and handling. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3858 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3859 Delta computation can be slow, so the choice of delta reuse policy can |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3860 significantly affect run time. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3861 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3862 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3863 two extremes. Deltas will be reused if they are appropriate. But if the |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3864 delta could choose a better revision, it will do so. This means if you |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3865 are converting a non-generaldelta revlog to a generaldelta revlog, |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3866 deltas will be recomputed if the delta's parent isn't a parent of the |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3867 revision. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3868 |
40855
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
3869 In addition to the delta policy, the ``forcedeltabothparents`` |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
3870 argument controls whether to force compute deltas against both parents |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
3871 for merges. By default, the current default is used. |
43133
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3872 |
47100
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47099
diff
changeset
|
3873 See `revlogutil.sidedata.get_sidedata_helpers` for the doc on |
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47099
diff
changeset
|
3874 `sidedata_helpers`. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3875 """ |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3876 if deltareuse not in self.DELTAREUSEALL: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3877 raise ValueError( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3878 _(b'value for deltareuse invalid: %s') % deltareuse |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3879 ) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3880 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3881 if len(destrevlog): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3882 raise ValueError(_(b'destination revlog is not empty')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3883 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3884 if getattr(self, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3885 raise ValueError(_(b'source revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3886 if getattr(destrevlog, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3887 raise ValueError(_(b'destination revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3888 |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
3889 # lazydelta and lazydeltabase controls whether to reuse a cached delta, |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
3890 # if possible. |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3891 old_delta_config = destrevlog.delta_config |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3892 destrevlog.delta_config = destrevlog.delta_config.copy() |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3893 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3894 try: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3895 if deltareuse == self.DELTAREUSEALWAYS: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3896 destrevlog.delta_config.lazy_delta_base = True |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3897 destrevlog.delta_config.lazy_delta = True |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3898 elif deltareuse == self.DELTAREUSESAMEREVS: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3899 destrevlog.delta_config.lazy_delta_base = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3900 destrevlog.delta_config.lazy_delta = True |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
3901 elif deltareuse == self.DELTAREUSENEVER: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3902 destrevlog.delta_config.lazy_delta_base = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3903 destrevlog.delta_config.lazy_delta = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3904 |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3905 delta_both_parents = ( |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3906 forcedeltabothparents or old_delta_config.delta_both_parents |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3907 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3908 destrevlog.delta_config.delta_both_parents = delta_both_parents |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3909 |
50792
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3910 with self.reading(), destrevlog._writing(tr): |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3911 self._clone( |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3912 tr, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3913 destrevlog, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3914 addrevisioncb, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3915 deltareuse, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3916 forcedeltabothparents, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3917 sidedata_helpers, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3918 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3919 |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3920 finally: |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3921 destrevlog.delta_config = old_delta_config |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3922 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3923 def _clone( |
43133
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3924 self, |
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3925 tr, |
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3926 destrevlog, |
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3927 addrevisioncb, |
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3928 deltareuse, |
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3929 forcedeltabothparents, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3930 sidedata_helpers, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3931 ): |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3932 """perform the core duty of `revlog.clone` after parameter processing""" |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3933 write_debug = None |
51059
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51056
diff
changeset
|
3934 if self.delta_config.debug_delta: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3935 write_debug = tr._report |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3936 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3937 destrevlog, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3938 write_debug=write_debug, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3939 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3940 index = self.index |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3941 for rev in self: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3942 entry = index[rev] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3943 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3944 # Some classes override linkrev to take filtered revs into |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3945 # account. Use raw entry from index. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3946 flags = entry[0] & 0xFFFF |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3947 linkrev = entry[4] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3948 p1 = index[entry[5]][7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3949 p2 = index[entry[6]][7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3950 node = entry[7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3951 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3952 # (Possibly) reuse the delta from the revlog if allowed and |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3953 # the revlog chunk is a delta. |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3954 cachedelta = None |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3955 rawtext = None |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3956 if deltareuse == self.DELTAREUSEFULLADD: |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
3957 text = self._revisiondata(rev) |
47390
fec306b05328
revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47388
diff
changeset
|
3958 sidedata = self.sidedata(rev) |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3959 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3960 if sidedata_helpers is not None: |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47098
diff
changeset
|
3961 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3962 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3963 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3964 flags = flags | new_flags[0] & ~new_flags[1] |
45735
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45671
diff
changeset
|
3965 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3966 destrevlog.addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3967 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3968 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3969 linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3970 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3971 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3972 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3973 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3974 flags=flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3975 deltacomputer=deltacomputer, |
43133
3de4d13f22be
revlog: add a way to control sidedata changes during revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43117
diff
changeset
|
3976 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3977 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3978 else: |
51071
b79c73a7afce
revlog: remove legacy usage of `_lazydelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51070
diff
changeset
|
3979 if destrevlog.delta_config.lazy_delta: |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3980 dp = self.deltaparent(rev) |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3981 if dp != nullrev: |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3982 cachedelta = (dp, bytes(self._inner._chunk(rev))) |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3983 |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3984 sidedata = None |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3985 if not cachedelta: |
50791
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3986 try: |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3987 rawtext = self._revisiondata(rev) |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3988 except error.CensoredNodeError as censored: |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3989 assert flags & REVIDX_ISCENSORED |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3990 rawtext = censored.tombstone |
47390
fec306b05328
revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47388
diff
changeset
|
3991 sidedata = self.sidedata(rev) |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3992 if sidedata is None: |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3993 sidedata = self.sidedata(rev) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3994 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3995 if sidedata_helpers is not None: |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47098
diff
changeset
|
3996 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3997 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3998 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3999 flags = flags | new_flags[0] & ~new_flags[1] |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
4000 |
50792
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4001 destrevlog._addrevision( |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4002 node, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4003 rawtext, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4004 tr, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4005 linkrev, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4006 p1, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4007 p2, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4008 flags, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4009 cachedelta, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4010 deltacomputer=deltacomputer, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4011 sidedata=sidedata, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
4012 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
4013 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
4014 if addrevisioncb: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
4015 addrevisioncb(self, rev, node) |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
4016 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
4017 def censorrevision(self, tr, censornode, tombstone=b''): |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4018 if self._format_version == REVLOGV0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4019 raise error.RevlogError( |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4020 _(b'cannot censor with version %d revlogs') |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4021 % self._format_version |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4022 ) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
4023 elif self._format_version == REVLOGV1: |
47470
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
4024 rewrite.v1_censor(self, tr, censornode, tombstone) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
4025 else: |
47470
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
4026 rewrite.v2_censor(self, tr, censornode, tombstone) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
4027 |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4028 def verifyintegrity(self, state): |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4029 """Verifies the integrity of the revlog. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4030 |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4031 Yields ``revlogproblem`` instances describing problems that are |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4032 found. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4033 """ |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4034 dd, di = self.checksize() |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4035 if dd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4036 yield revlogproblem(error=_(b'data length off by %d bytes') % dd) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4037 if di: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4038 yield revlogproblem(error=_(b'index contains %d extra bytes') % di) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
4039 |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4040 version = self._format_version |
39850
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
4041 |
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
4042 # The verifier tells us what version revlog we should be. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4043 if version != state[b'expectedversion']: |
39850
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
4044 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4045 warning=_(b"warning: '%s' uses revlog format %d; expected %d") |
47171
3a9f3470922c
revlog: use revlog.display_id in format related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47169
diff
changeset
|
4046 % (self.display_id, version, state[b'expectedversion']) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4047 ) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4048 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4049 state[b'skipread'] = set() |
44073
b9e174d4ed11
verify: allow the storage to signal when renames can be tested on `skipread`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44054
diff
changeset
|
4050 state[b'safe_renamed'] = set() |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4051 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4052 for rev in self: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4053 node = self.node(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4054 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4055 # Verify contents. 4 cases to care about: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4056 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4057 # common: the most common case |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4058 # rename: with a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4059 # meta: file content starts with b'\1\n', the metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4060 # header defined in filelog.py, but without a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4061 # ext: content stored externally |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4062 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4063 # More formally, their differences are shown below: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4064 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4065 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4066 # ------------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4067 # flags() | 0 | 0 | 0 | not 0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4068 # renamed() | False | True | False | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4069 # rawtext[0:2]=='\1\n'| False | True | True | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4070 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4071 # "rawtext" means the raw text stored in revlog data, which |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
4072 # could be retrieved by "rawdata(rev)". "text" |
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
4073 # mentioned below is "revision(rev)". |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4074 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4075 # There are 3 different lengths stored physically: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4076 # 1. L1: rawsize, stored in revlog index |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4077 # 2. L2: len(rawtext), stored in revlog data |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4078 # 3. L3: len(text), stored in revlog data if flags==0, or |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4079 # possibly somewhere else if flags!=0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4080 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4081 # L1 should be equal to L2. L3 could be different from them. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4082 # "text" may or may not affect commit hash depending on flag |
42749
6d61be152c55
flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42748
diff
changeset
|
4083 # processors (see flagutil.addflagprocessor). |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4084 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4085 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4086 # ------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4087 # rawsize() | L1 | L1 | L1 | L1 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4088 # size() | L1 | L2-LM | L1(*) | L1 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4089 # len(rawtext) | L2 | L2 | L2 | L2 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4090 # len(text) | L2 | L2 | L2 | L3 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4091 # len(read()) | L2 | L2-LM | L2-LM | L3 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4092 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4093 # LM: length of metadata, depending on rawtext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4094 # (*): not ideal, see comment in filelog.size |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4095 # (?): could be "- len(meta)" if the resolved content has |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4096 # rename metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4097 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4098 # Checks needed to be done: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4099 # 1. length check: L1 == L2, in all cases. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4100 # 2. hash check: depending on flag processor, we may need to |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4101 # use either "text" (external), or "rawtext" (in revlog). |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4102 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4103 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4104 skipflags = state.get(b'skipflags', 0) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4105 if skipflags: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4106 skipflags &= self.flags(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4107 |
43962
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
4108 _verify_revision(self, skipflags, state, node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4109 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4110 l1 = self.rawsize(rev) |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
4111 l2 = len(self.rawdata(node)) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4112 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4113 if l1 != l2: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4114 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4115 error=_(b'unpacked size is %d, %d expected') % (l2, l1), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4116 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4117 ) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4118 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4119 except error.CensoredNodeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4120 if state[b'erroroncensored']: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4121 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4122 error=_(b'censored file data'), node=node |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4123 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4124 state[b'skipread'].add(node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4125 except Exception as e: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4126 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4127 error=_(b'unpacking %s: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4128 % (short(node), stringutil.forcebytestr(e)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4129 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4130 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4131 state[b'skipread'].add(node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4132 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4133 def storageinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4134 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4135 exclusivefiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4136 sharedfiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4137 revisionscount=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4138 trackedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4139 storedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4140 ): |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4141 d = {} |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4142 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4143 if exclusivefiles: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
4144 d[b'exclusivefiles'] = [(self.opener, self._indexfile)] |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4145 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
4146 d[b'exclusivefiles'].append((self.opener, self._datafile)) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4147 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4148 if sharedfiles: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4149 d[b'sharedfiles'] = [] |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4150 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4151 if revisionscount: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4152 d[b'revisionscount'] = len(self) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4153 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4154 if trackedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4155 d[b'trackedsize'] = sum(map(self.rawsize, iter(self))) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4156 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4157 if storedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4158 d[b'storedsize'] = sum( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4159 self.opener.stat(path).st_size for path in self.files() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4160 ) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4161 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4162 return d |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4163 |
47227
2bd4b5218918
revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47226
diff
changeset
|
4164 def rewrite_sidedata(self, transaction, helpers, startrev, endrev): |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
4165 if not self.feature_config.has_side_data: |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4166 return |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4167 # revlog formats with sidedata support does not support inline |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4168 assert not self._inline |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4169 if not helpers[1] and not helpers[2]: |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4170 # Nothing to generate or remove |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4171 return |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4172 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4173 new_entries = [] |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4174 # append the new sidedata |
47229
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
4175 with self._writing(transaction): |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
4176 ifh, dfh, sdfh = self._inner._writinghandles |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4177 dfh.seek(self._docket.sidedata_end, os.SEEK_SET) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4178 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4179 current_offset = sdfh.tell() |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4180 for rev in range(startrev, endrev + 1): |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4181 entry = self.index[rev] |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47098
diff
changeset
|
4182 new_sidedata, flags = sidedatautil.run_sidedata_helpers( |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4183 store=self, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4184 sidedata_helpers=helpers, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4185 sidedata={}, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4186 rev=rev, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4187 ) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4188 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4189 serialized_sidedata = sidedatautil.serialize_sidedata( |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4190 new_sidedata |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4191 ) |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4192 |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4193 sidedata_compression_mode = COMP_MODE_INLINE |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
4194 if serialized_sidedata and self.feature_config.has_side_data: |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4195 sidedata_compression_mode = COMP_MODE_PLAIN |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
4196 h, comp_sidedata = self._inner.compress(serialized_sidedata) |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4197 if ( |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4198 h != b'u' |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4199 and comp_sidedata[0] != b'\0' |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4200 and len(comp_sidedata) < len(serialized_sidedata) |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4201 ): |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4202 assert not h |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4203 if ( |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4204 comp_sidedata[0] |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4205 == self._docket.default_compression_header |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4206 ): |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4207 sidedata_compression_mode = COMP_MODE_DEFAULT |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4208 serialized_sidedata = comp_sidedata |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4209 else: |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4210 sidedata_compression_mode = COMP_MODE_INLINE |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4211 serialized_sidedata = comp_sidedata |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4212 if entry[8] != 0 or entry[9] != 0: |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4213 # rewriting entries that already have sidedata is not |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4214 # supported yet, because it introduces garbage data in the |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4215 # revlog. |
47239
e51392acd70c
revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47233
diff
changeset
|
4216 msg = b"rewriting existing sidedata is not supported yet" |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4217 raise error.Abort(msg) |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4218 |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4219 # Apply (potential) flags to add and to remove after running |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4220 # the sidedata helpers |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4221 new_offset_flags = entry[0] | flags[0] & ~flags[1] |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4222 entry_update = ( |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4223 current_offset, |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4224 len(serialized_sidedata), |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4225 new_offset_flags, |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4226 sidedata_compression_mode, |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4227 ) |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4228 |
47228
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
4229 # the sidedata computation might have move the file cursors around |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4230 sdfh.seek(current_offset, os.SEEK_SET) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4231 sdfh.write(serialized_sidedata) |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4232 new_entries.append(entry_update) |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4233 current_offset += len(serialized_sidedata) |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4234 self._docket.sidedata_end = sdfh.tell() |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4235 |
47229
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
4236 # rewrite the new index entries |
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
4237 ifh.seek(startrev * self.index.entry_size) |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4238 for i, e in enumerate(new_entries): |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4239 rev = startrev + i |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4240 self.index.replace_sidedata_info(rev, *e) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
4241 packed = self.index.entry_binary(rev) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
4242 if rev == 0 and self._docket is None: |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4243 header = self._format_flags | self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4244 header = self.index.pack_header(header) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
4245 packed = header + packed |
47226
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47225
diff
changeset
|
4246 ifh.write(packed) |