Mercurial > public > mercurial-scm > hg
annotate mercurial/revlog.py @ 51178:dcaa2df1f688
changelog: never inline changelog
The test suite mostly use small repositories, that implies that most changelog in the
tests are inlined. As a result, non-inlined changelog are quite poorly tested.
Since non-inline changelog are most common case for serious repositories, this
lack of testing is a significant problem that results in high profile issue like
the one recently fixed by 66417f55ea33 and 849745d7da89.
Inlining the changelog does not bring much to the table, the number of total
file saved is negligible, and the changelog will be read by most operation
anyway.
So this changeset is make it so we never inline the changelog, and de-inline the
one that are still inlined whenever we touch them.
By doing that, we remove the "dual code path" situation for writing new entry to
the changelog and move to a "single code path" situation. Having a single
code path simplify the code and make sure it is covered by test (if test cover
that situation obviously)
This impact all tests that care about the number of file and the exchange size,
but there is nothing too complicated in them just a lot of churn.
The churn is made "worse" by the fact rust will use the persistent nodemap on
any changelog now. Which is overall a win as it means testing the persistent
nodemap more and having less special cases.
In short, having inline changelog is mostly useless and an endless source of
pain. We get rid of it.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 11 Dec 2023 22:27:59 +0100 |
parents | 849745d7da89 |
children | a93e52f0b6ff |
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 |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
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:
46806
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 |
35973
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
35972
diff
changeset
|
18 import contextlib |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42462
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, |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46779
diff
changeset
|
30 sha1nodeconstants, |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
31 short, |
32403
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32393
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 _ |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
35 from .revlogutils.constants import ( |
47072
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47042
diff
changeset
|
36 ALL_KINDS, |
47266
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
37 CHANGELOGV2, |
47255
ff9fd7107d11
revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
38 COMP_MODE_DEFAULT, |
47249
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
39 COMP_MODE_INLINE, |
47253
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
40 COMP_MODE_PLAIN, |
49677
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49663
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:
49663
diff
changeset
|
42 DELTA_BASE_REUSE_TRY, |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
43 ENTRY_RANK, |
47231
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47230
diff
changeset
|
44 FEATURES_BY_VERSION, |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
45 FLAG_GENERALDELTA, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
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, |
47263
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47261
diff
changeset
|
48 KIND_CHANGELOG, |
49534
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49533
diff
changeset
|
49 KIND_FILELOG, |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
50 RANK_UNKNOWN, |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
51 REVLOGV0, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
52 REVLOGV1, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
53 REVLOGV1_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
54 REVLOGV2, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
55 REVLOGV2_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
56 REVLOG_DEFAULT_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
57 REVLOG_DEFAULT_FORMAT, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
58 REVLOG_DEFAULT_VERSION, |
47230
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
59 SUPPORTED_FLAGS, |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
60 ) |
42728
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
diff
changeset
|
61 from .revlogutils.flagutil import ( |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
diff
changeset
|
62 REVIDX_DEFAULT_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
diff
changeset
|
63 REVIDX_ELLIPSIS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
diff
changeset
|
64 REVIDX_EXTSTORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
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:
45053
diff
changeset
|
66 REVIDX_HASCOPIESINFO, |
42728
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
diff
changeset
|
67 REVIDX_ISCENSORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
diff
changeset
|
68 REVIDX_RAWTEXT_CHANGING_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42719
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, |
39862
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39845
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, |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32315
diff
changeset
|
76 policy, |
31574
a8e55d6f1d67
revlog: use pycompat.maplist to eagerly evaluate map on Python 3
Augie Fackler <augie@google.com>
parents:
31504
diff
changeset
|
77 pycompat, |
47394
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
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 ) |
42813
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42792
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:
42792
diff
changeset
|
83 repository, |
42814
2c4f656c8e9f
interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42813
diff
changeset
|
84 util as interfaceutil, |
42813
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42792
diff
changeset
|
85 ) |
39330
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39329
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:
39329
diff
changeset
|
87 deltas as deltautil, |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
88 docket as docketutil, |
42729
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42728
diff
changeset
|
89 flagutil, |
44034
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44014
diff
changeset
|
90 nodemap as nodemaputil, |
47425
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47414
diff
changeset
|
91 randomaccessfile, |
47038
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47037
diff
changeset
|
92 revlogv0, |
47465
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47463
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, |
39330
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39329
diff
changeset
|
95 ) |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36760
diff
changeset
|
96 from .utils import ( |
39877
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39872
diff
changeset
|
97 storageutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36760
diff
changeset
|
98 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36760
diff
changeset
|
99 ) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
100 |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
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:
39232
diff
changeset
|
102 # We need these name available in the module for extensions. |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
103 |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
104 REVLOGV0 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
105 REVLOGV1 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
106 REVLOGV2 |
48769
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48765
diff
changeset
|
107 CHANGELOGV2 |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
108 FLAG_INLINE_DATA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
109 FLAG_GENERALDELTA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
110 REVLOG_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
111 REVLOG_DEFAULT_FORMAT |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
112 REVLOG_DEFAULT_VERSION |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
113 REVLOGV1_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
114 REVLOGV2_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
115 REVIDX_ISCENSORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
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:
45053
diff
changeset
|
117 REVIDX_HASCOPIESINFO |
39329
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
118 REVIDX_EXTSTORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
119 REVIDX_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
120 REVIDX_FLAGS_ORDER |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
121 REVIDX_RAWTEXT_CHANGING_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39232
diff
changeset
|
122 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43440
diff
changeset
|
123 parsers = policy.importmod('parsers') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43440
diff
changeset
|
124 rustancestor = policy.importrust('ancestor') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43440
diff
changeset
|
125 rustdagop = policy.importrust('dagop') |
44014
8042856c90b6
rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents:
43979
diff
changeset
|
126 rustrevlog = policy.importrust('revlog') |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32315
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 |
49828
9854a9adc466
revlog: fix misleading comment about _maxinline
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49766
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 |
39767
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
134 # Flag processors for REVIDX_ELLIPSIS. |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
135 def ellipsisreadprocessor(rl, text): |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
136 return text, False |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
137 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
138 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
139 def ellipsiswriteprocessor(rl, text): |
39767
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
140 return text, False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
141 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
142 |
39767
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
143 def ellipsisrawprocessor(rl, text): |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
144 return False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
145 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
146 |
39767
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
147 ellipsisprocessor = ( |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
148 ellipsisreadprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
149 ellipsiswriteprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
150 ellipsisrawprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
151 ) |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39333
diff
changeset
|
152 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
153 |
43957
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43779
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:
43779
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:
43779
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:
43779
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:
43779
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:
43779
diff
changeset
|
159 else: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43779
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:
43779
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:
43779
diff
changeset
|
162 |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43779
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:
45942
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:
45942
diff
changeset
|
165 # |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45942
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:
45942
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:
45942
diff
changeset
|
168 # wheelbarrow of other slowness source) |
50925
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50811
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:
45942
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:
45942
diff
changeset
|
171 ) |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45942
diff
changeset
|
172 |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45942
diff
changeset
|
173 |
39231
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
174 @interfaceutil.implementer(repository.irevisiondelta) |
39862
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39845
diff
changeset
|
175 @attr.s(slots=True) |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48928
diff
changeset
|
176 class revlogrevisiondelta: |
39231
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
177 node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
178 p1node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
179 p2node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
180 basenode = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
181 flags = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
182 baserevisionsize = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
183 revision = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
184 delta = attr.ib() |
46712
e8c11a2c96c0
delta: add sidedata field to revision delta
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46711
diff
changeset
|
185 sidedata = attr.ib() |
47077
119790e1c67c
cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47075
diff
changeset
|
186 protocol_flags = attr.ib() |
39862
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39845
diff
changeset
|
187 linknode = attr.ib(default=None) |
39231
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39192
diff
changeset
|
188 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
189 |
39842
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
190 @interfaceutil.implementer(repository.iverifyproblem) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
191 @attr.s(frozen=True) |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48928
diff
changeset
|
192 class revlogproblem: |
39842
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
193 warning = attr.ib(default=None) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
194 error = attr.ib(default=None) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
195 node = attr.ib(default=None) |
39842
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
196 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
197 |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
198 def parse_index_v1(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
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:
47034
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:
47034
diff
changeset
|
201 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
202 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
203 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
204 def parse_index_v2(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
205 # call the C implementation to parse the index data |
48769
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48765
diff
changeset
|
206 index, cache = parsers.parse_index2(data, inline, format=REVLOGV2) |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
207 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
208 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
209 |
47270
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
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:
47269
diff
changeset
|
211 # call the C implementation to parse the index data |
48769
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48765
diff
changeset
|
212 index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2) |
47270
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
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:
47269
diff
changeset
|
214 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
215 |
50925
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50811
diff
changeset
|
216 if hasattr(parsers, 'parse_index_devel_nodemap'): |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
217 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
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:
47034
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:
47034
diff
changeset
|
220 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
221 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
222 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
223 else: |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
224 parse_index_v1_nodemap = None |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
225 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
226 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
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:
47034
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:
47034
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 |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
236 FILE_TOO_SHORT_MSG = _( |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
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:
47387
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:
47387
diff
changeset
|
239 ) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
240 |
49415
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49306
diff
changeset
|
241 hexdigits = b'0123456789abcdefABCDEF' |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49306
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 |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
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:
51026
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:
51026
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:
51026
diff
changeset
|
247 |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
248 |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
249 @attr.s() |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
250 class FeatureConfig(_Config): |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
diff
changeset
|
252 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
253 # the default compression engine |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
diff
changeset
|
255 # compression engines options |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
diff
changeset
|
257 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
diff
changeset
|
272 |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
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:
51026
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:
51026
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:
51026
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:
51026
diff
changeset
|
277 |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
278 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
279 @attr.s() |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
280 class DataConfig(_Config): |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
diff
changeset
|
282 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
diff
changeset
|
290 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
diff
changeset
|
297 |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
diff
changeset
|
300 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
diff
changeset
|
303 |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
diff
changeset
|
310 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
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:
51023
diff
changeset
|
313 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
314 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
315 @attr.s() |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
316 class DeltaConfig(_Config): |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
diff
changeset
|
318 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
diff
changeset
|
320 self contained. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
321 """ |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
322 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
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:
51023
diff
changeset
|
344 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
345 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
diff
changeset
|
348 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
diff
changeset
|
351 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
352 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
361 data_config, |
51090
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
362 delta_config, |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
363 feature_config, |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
364 chunk_cache, |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
365 default_compression_header, |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
366 ): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
diff
changeset
|
369 |
51086
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51085
diff
changeset
|
370 self.__index_file = index_file |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
374 self.data_config = data_config |
51090
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
375 self.delta_config = delta_config |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
377 |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
diff
changeset
|
380 |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
381 self._default_compression_header = default_compression_header |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
382 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
diff
changeset
|
384 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
diff
changeset
|
387 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
393 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
398 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
399 |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
401 self._decompressors = {} |
51093
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
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:
51092
diff
changeset
|
403 self._revisioncache = None |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
404 |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
406 # rev → uncompressed_chunk |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
407 # |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
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:
51104
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:
51104
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:
51104
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:
51104
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:
51104
diff
changeset
|
415 ) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
416 |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
diff
changeset
|
418 |
51086
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51085
diff
changeset
|
419 @property |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51085
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:
51085
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:
51085
diff
changeset
|
422 |
c2c24b6b97f5
revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51085
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:
51085
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:
51085
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:
51085
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:
51085
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:
51085
diff
changeset
|
428 |
51090
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
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:
51089
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:
51089
diff
changeset
|
431 |
51098
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
432 def clear_cache(self): |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
433 assert not self.is_delaying |
51098
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
434 self._revisioncache = None |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
436 self._uncompressed_chunk_cache.clear() |
51098
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
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:
51096
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:
51096
diff
changeset
|
439 |
51102
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
440 @property |
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
441 def canonical_index_file(self): |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
diff
changeset
|
443 return self._orig_index_file |
51102
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
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:
51099
diff
changeset
|
445 |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
449 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
454 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
455 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
diff
changeset
|
457 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
461 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
465 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
469 |
51090
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
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:
51089
diff
changeset
|
511 |
51092
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
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:
51091
diff
changeset
|
514 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
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:
51091
diff
changeset
|
517 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
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:
51091
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:
51091
diff
changeset
|
521 """ |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
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:
51091
diff
changeset
|
524 try: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
diff
changeset
|
526 except AttributeError: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
527 pass |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
528 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
529 chain = [] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
530 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
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:
51091
diff
changeset
|
533 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
534 iterrev = rev |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
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:
51091
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:
51091
diff
changeset
|
538 if generaldelta: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
diff
changeset
|
540 else: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
541 iterrev -= 1 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
diff
changeset
|
543 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
diff
changeset
|
545 stopped = True |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
546 else: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
diff
changeset
|
548 stopped = False |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
549 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
550 chain.reverse() |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
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:
51091
diff
changeset
|
552 |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
558 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
559 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
568 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
570 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
diff
changeset
|
573 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
577 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
582 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
584 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
589 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
591 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
595 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
599 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
diff
changeset
|
602 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
diff
changeset
|
605 """ |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
diff
changeset
|
608 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
612 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
614 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
620 # engines |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
621 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
627 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
631 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
633 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
639 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
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:
51087
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:
51087
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:
51087
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:
51087
diff
changeset
|
645 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
647 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
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:
51087
diff
changeset
|
649 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
659 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
664 |
51099
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
665 @property |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
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:
51098
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:
51098
diff
changeset
|
668 |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
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:
51098
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:
51098
diff
changeset
|
671 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
675 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
diff
changeset
|
677 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
709 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
734 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
diff
changeset
|
737 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
diff
changeset
|
739 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
740 try: |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
746 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
754 ) |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
760 except FileNotFoundError: |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
766 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
770 ) |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
771 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
diff
changeset
|
774 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
diff
changeset
|
776 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
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:
51082
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:
51082
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:
51082
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:
51082
diff
changeset
|
782 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
783 |
51087
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
diff
changeset
|
785 """split the data of an inline revlog into an index and a data file""" |
51161
962974a5d068
revlog: add one more assert about state of thing when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51155
diff
changeset
|
786 assert self._delay_buffer is None |
51087
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
diff
changeset
|
800 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
diff
changeset
|
808 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
diff
changeset
|
819 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
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:
51086
diff
changeset
|
822 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
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:
51086
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:
51086
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:
51086
diff
changeset
|
827 ) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
828 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
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:
51086
diff
changeset
|
842 |
51084
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
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:
51083
diff
changeset
|
845 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
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:
51083
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:
51083
diff
changeset
|
849 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
diff
changeset
|
851 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
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:
51083
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:
51083
diff
changeset
|
855 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
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:
51083
diff
changeset
|
858 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
diff
changeset
|
860 at some point. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
861 """ |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
diff
changeset
|
863 # (functions are expensive). |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
864 index = self.index |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
865 istart = index[startrev] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
diff
changeset
|
867 if startrev == endrev: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
868 end = start + istart[1] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
869 else: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
870 iend = index[endrev] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
diff
changeset
|
872 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
873 if self.inline: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
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:
51083
diff
changeset
|
876 length = end - start |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
877 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
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:
51083
diff
changeset
|
879 |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
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:
51088
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:
51088
diff
changeset
|
882 |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
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:
51088
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:
51088
diff
changeset
|
885 be preserved. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
886 |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
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:
51088
diff
changeset
|
888 """ |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
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:
51104
diff
changeset
|
892 return uncomp |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
893 |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
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:
51088
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:
51088
diff
changeset
|
896 if compression_mode == COMP_MODE_PLAIN: |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
897 uncomp = data |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
898 elif compression_mode == COMP_MODE_DEFAULT: |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
899 uncomp = self._decompressor(data) |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
900 elif compression_mode == COMP_MODE_INLINE: |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
901 uncomp = self.decompress(data) |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
902 else: |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
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:
51088
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:
51088
diff
changeset
|
905 raise error.RevlogError(msg) |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
diff
changeset
|
908 return uncomp |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
909 |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
diff
changeset
|
912 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
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:
51090
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:
51090
diff
changeset
|
917 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
diff
changeset
|
920 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
diff
changeset
|
922 """ |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
diff
changeset
|
924 return [] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
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:
51090
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:
51090
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:
51090
diff
changeset
|
930 |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
931 fetched_revs = [] |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
933 |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
934 chunks = [] |
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
935 ladd = chunks.append |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
936 |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
938 fetched_revs = revs |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
939 else: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
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:
51104
diff
changeset
|
943 fadd(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
944 else: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
946 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
948 slicedchunks = () |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
diff
changeset
|
950 slicedchunks = (fetched_revs,) |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
951 else: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
diff
changeset
|
953 self, |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
954 fetched_revs, |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
955 targetsize=targetsize, |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
956 ) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
957 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
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:
51090
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:
51090
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:
51090
diff
changeset
|
963 break |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
964 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
965 try: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
diff
changeset
|
967 except OverflowError: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
diff
changeset
|
969 # 2G on Windows |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
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:
51103
diff
changeset
|
971 ladd((rev, self._chunk(rev))) |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
972 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
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:
51090
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:
51090
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:
51090
diff
changeset
|
978 if inline: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
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:
51090
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:
51090
diff
changeset
|
983 if comp_mode == COMP_MODE_PLAIN: |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
984 c = c |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
985 elif comp_mode == COMP_MODE_INLINE: |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
986 c = decomp(c) |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
987 elif comp_mode == COMP_MODE_DEFAULT: |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
988 c = def_decomp(c) |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
989 else: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
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:
51090
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:
51090
diff
changeset
|
992 raise error.RevlogError(msg) |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
993 ladd((rev, c)) |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
diff
changeset
|
996 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
diff
changeset
|
997 chunks.sort() |
51104
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
998 return [x[1] for x in chunks] |
51091
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
999 |
51094
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
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:
51093
diff
changeset
|
1002 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
diff
changeset
|
1004 """ |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
1005 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
diff
changeset
|
1007 cachedrev = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
diff
changeset
|
1009 basetext = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
1010 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
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:
51093
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:
51093
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:
51093
diff
changeset
|
1015 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
diff
changeset
|
1017 if stopped: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
diff
changeset
|
1019 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
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:
51093
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:
51093
diff
changeset
|
1023 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
1024 targetsize = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
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:
51093
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:
51093
diff
changeset
|
1028 |
51105
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51104
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:
51104
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:
51104
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:
51104
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:
51104
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:
51104
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:
51104
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:
51104
diff
changeset
|
1036 |
51094
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
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:
51093
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:
51093
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:
51093
diff
changeset
|
1041 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
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:
51093
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:
51093
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:
51093
diff
changeset
|
1045 |
51095
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
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:
51094
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:
51094
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:
51094
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:
51094
diff
changeset
|
1051 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1052 if self.inline: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
diff
changeset
|
1054 if sidedata_size == 0: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1055 return {} |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1056 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
diff
changeset
|
1058 filename = self.sidedata_file |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1059 end = sidedata_end |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1060 offset = sidedata_offset |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1061 length = sidedata_size |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
diff
changeset
|
1063 raise error.RevlogError(m) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1064 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
diff
changeset
|
1066 sidedata_offset, sidedata_size |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1067 ) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1068 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
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:
51094
diff
changeset
|
1071 segment = comp_segment |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
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:
51094
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:
51094
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:
51094
diff
changeset
|
1076 else: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
diff
changeset
|
1078 msg %= comp |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1079 raise error.RevlogError(msg) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1080 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
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:
51094
diff
changeset
|
1082 return sidedata |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1083 |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1084 def write_entry( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1085 self, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1086 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1087 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1088 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1089 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1090 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1091 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1092 sidedata_offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1093 index_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1094 data_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1095 sidedata_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1096 ): |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
diff
changeset
|
1104 # |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
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:
51095
diff
changeset
|
1115 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
diff
changeset
|
1117 if dfh: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
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:
51095
diff
changeset
|
1120 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
diff
changeset
|
1122 if sdfh: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
diff
changeset
|
1124 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
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:
51095
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:
51095
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:
51095
diff
changeset
|
1129 transaction.add(self.sidedata_file, sidedata_offset) |
51102
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
1130 transaction.add(self.canonical_index_file, curr * len(entry)) |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1131 if data[0]: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
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:
51095
diff
changeset
|
1134 if sidedata: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1135 sdfh.write(sidedata) |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1139 self._delay_buffer.append(entry) |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1140 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1141 offset += curr * self.index.entry_size |
51102
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
1142 transaction.add(self.canonical_index_file, offset) |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1143 assert not sidedata |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1151 self._delay_buffer.append(data[1]) |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1152 return ( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1153 ifh.tell(), |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
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:
51095
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:
51095
diff
changeset
|
1156 ) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
1157 |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
diff
changeset
|
1160 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1174 else: |
51162
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51161
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:
51161
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:
51161
diff
changeset
|
1177 self._segmentfile._delay_buffer = self._delay_buffer |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
diff
changeset
|
1179 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1191 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1196 any_pending = True |
51162
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51161
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:
51161
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:
51161
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:
51161
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:
51161
diff
changeset
|
1201 assert self._segmentfile._delay_buffer is None |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1205 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
diff
changeset
|
1208 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
diff
changeset
|
1211 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1226 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
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:
51102
diff
changeset
|
1233 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1234 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48928
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. | |
29997
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29830
diff
changeset
|
1259 |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29830
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:
29830
diff
changeset
|
1261 writing, to avoid file stat ambiguity. |
34296
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34291
diff
changeset
|
1262 |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34291
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:
34291
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:
34291
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. |
42462
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42452
diff
changeset
|
1268 |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42452
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:
42452
diff
changeset
|
1270 compression for the data content. |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
1271 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
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:
46509
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:
46509
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:
46509
diff
changeset
|
1275 raising). |
47246
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
1276 |
47393
7a0ec25d5836
revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47391
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:
47391
diff
changeset
|
1278 index entry. |
1083 | 1279 """ |
42994
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42993
diff
changeset
|
1280 |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42993
diff
changeset
|
1281 _flagserrorclass = error.RevlogError |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42993
diff
changeset
|
1282 |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1283 @staticmethod |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1284 def is_inline_index(header_bytes): |
50999
4ea606568f61
revlog: document the `is_inline_index` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50926
diff
changeset
|
1285 """Determine if a revlog is inline from the initial bytes of the index""" |
51074
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50811
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:
50811
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:
50811
diff
changeset
|
1288 |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1289 header = INDEX_HEADER.unpack(header_bytes)[0] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1290 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1291 _format_flags = header & ~0xFFFF |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1292 _format_version = header & 0xFFFF |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1293 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1294 features = FEATURES_BY_VERSION[_format_version] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1295 return features[b'inline'](_format_flags) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
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, |
47072
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47042
diff
changeset
|
1300 target, |
47150
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47149
diff
changeset
|
1301 radix, |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
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, |
44308
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
1307 persistentnodemap=False, |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
1308 concurrencychecker=None, |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
1309 trypending=False, |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
1310 try_split=False, |
49012
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1311 canonical_parent_order=True, |
51154
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51115
diff
changeset
|
1312 data_config=None, |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51115
diff
changeset
|
1313 delta_config=None, |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51115
diff
changeset
|
1314 feature_config=None, |
51155
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51154
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. | |
42462
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42452
diff
changeset
|
1322 |
47072
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47042
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:
47042
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:
47042
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:
47042
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:
47042
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:
47042
diff
changeset
|
1328 accurate value. |
1083 | 1329 """ |
47150
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47149
diff
changeset
|
1330 |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47149
diff
changeset
|
1331 self.radix = radix |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47149
diff
changeset
|
1332 |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1333 self._docket_file = None |
47168
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
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:
47167
diff
changeset
|
1335 self._datafile = None |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1336 self._sidedatafile = None |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1337 self._nodemap_file = None |
47145
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47144
diff
changeset
|
1338 self.postfix = postfix |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
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:
49828
diff
changeset
|
1340 self._try_split = try_split |
51155
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51154
diff
changeset
|
1341 self._may_inline = may_inline |
47151
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
1342 self.opener = opener |
44308
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
1343 if persistentnodemap: |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1344 self._nodemap_file = nodemaputil.get_nodemap_file(self) |
47151
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
1345 |
47072
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47042
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:
47042
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:
47042
diff
changeset
|
1348 self.target = target |
51154
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51115
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:
51115
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:
51115
diff
changeset
|
1351 elif b'feature-config' in self.opener.options: |
51028
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
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:
51027
diff
changeset
|
1353 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
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:
51027
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:
51027
diff
changeset
|
1356 self.feature_config.canonical_parent_order = canonical_parent_order |
51154
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51115
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:
51115
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:
51115
diff
changeset
|
1359 elif b'data-config' in self.opener.options: |
51028
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
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:
51027
diff
changeset
|
1361 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
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:
51027
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:
51027
diff
changeset
|
1364 self.data_config.mmap_large_index = mmaplargeindex |
51154
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51115
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:
51115
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:
51115
diff
changeset
|
1367 elif b'delta-config' in self.opener.options: |
51028
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
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:
51027
diff
changeset
|
1369 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
1370 self.delta_config = DeltaConfig() |
51080
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51079
diff
changeset
|
1371 self.delta_config.upper_bound_comp = upperboundcomp |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1372 |
29830
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
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:
29829
diff
changeset
|
1374 self._chainbasecache = util.lrucachedict(100) |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1375 |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43524
diff
changeset
|
1376 self.index = None |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1377 self._docket = None |
44323
76a96e3a2bbb
nodemap: keep track of the docket for loaded data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
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 |
49663
45d7b8c380d7
changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49657
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:
49657
diff
changeset
|
1383 |
39768
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39767
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:
39767
diff
changeset
|
1385 # custom flags. |
42729
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42728
diff
changeset
|
1386 self._flagprocessors = dict(flagutil.flagprocessors) |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
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:
47213
diff
changeset
|
1388 self._adding_group = None |
40627
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40626
diff
changeset
|
1389 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
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:
51082
diff
changeset
|
1391 self._load_inner(chunk_cache) |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
1392 self._concurrencychecker = concurrencychecker |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
1393 |
47144
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1394 def _init_opts(self): |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1395 """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:
47143
diff
changeset
|
1396 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1397 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:
47143
diff
changeset
|
1398 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1399 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:
47143
diff
changeset
|
1400 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1401 * newversionflags: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1402 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:
47143
diff
changeset
|
1403 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1404 * mmapindexthreshold: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1405 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:
47143
diff
changeset
|
1406 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1407 * force_nodemap: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1408 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:
47143
diff
changeset
|
1409 """ |
43025
3518da504303
vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43024
diff
changeset
|
1410 opts = self.opener.options |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41115
diff
changeset
|
1411 |
47263
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47261
diff
changeset
|
1412 if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG: |
47266
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
1413 new_header = CHANGELOGV2 |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1414 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:
51023
diff
changeset
|
1415 self.feature_config.compute_rank = compute_rank |
47263
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47261
diff
changeset
|
1416 elif b'revlogv2' in opts: |
47261
80164d50ae3d
revlogv2: no longer attempt to use inline for new revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47259
diff
changeset
|
1417 new_header = REVLOGV2 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1418 elif b'revlogv1' in opts: |
51155
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51154
diff
changeset
|
1419 new_header = REVLOGV1 |
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51154
diff
changeset
|
1420 if self._may_inline: |
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51154
diff
changeset
|
1421 new_header |= FLAG_INLINE_DATA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1422 if b'generaldelta' in opts: |
47171
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47170
diff
changeset
|
1423 new_header |= FLAG_GENERALDELTA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1424 elif b'revlogv0' in self.opener.options: |
47171
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47170
diff
changeset
|
1425 new_header = REVLOGV0 |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41115
diff
changeset
|
1426 else: |
47171
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47170
diff
changeset
|
1427 new_header = REVLOG_DEFAULT_VERSION |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41115
diff
changeset
|
1428 |
51039
027bc364524b
revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51038
diff
changeset
|
1429 mmapindexthreshold = None |
51046
3977068c638c
revlog: remove legacy usage of `_mmaplargeindex`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51045
diff
changeset
|
1430 if self.data_config.mmap_large_index: |
51039
027bc364524b
revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51038
diff
changeset
|
1431 mmapindexthreshold = self.data_config.mmap_index_threshold |
51038
683b96c416d8
revlog: skip opener options to pass enable_ellipsis
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51037
diff
changeset
|
1432 if self.feature_config.enable_ellipsis: |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41115
diff
changeset
|
1433 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41115
diff
changeset
|
1434 |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41115
diff
changeset
|
1435 # revlog v0 doesn't have flag processors |
48928
ceafb0f81250
revlog: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
1436 for flag, processor in opts.get(b'flagprocessors', {}).items(): |
42731
5109217a9ab6
flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42730
diff
changeset
|
1437 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
|
1438 |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1439 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:
51023
diff
changeset
|
1440 if chunk_cache_size <= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1441 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
|
1442 _(b'revlog chunk cache size %r is not greater than 0') |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1443 % chunk_cache_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1444 ) |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1445 elif chunk_cache_size & (chunk_cache_size - 1): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1446 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
|
1447 _(b'revlog chunk cache size %r is not a power of 2') |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1448 % chunk_cache_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1449 ) |
47144
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1450 force_nodemap = opts.get(b'devel-force-nodemap', False) |
47171
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47170
diff
changeset
|
1451 return new_header, mmapindexthreshold, force_nodemap |
47144
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1452 |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1453 def _get_data(self, filepath, mmap_threshold, size=None): |
47169
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1454 """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:
47168
diff
changeset
|
1455 |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1456 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:
47168
diff
changeset
|
1457 try: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1458 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:
47168
diff
changeset
|
1459 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:
47168
diff
changeset
|
1460 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:
47168
diff
changeset
|
1461 if file_size >= mmap_threshold: |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1462 if size is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1463 # avoid potentiel mmap crash |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1464 size = min(file_size, size) |
47169
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1465 # 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:
47168
diff
changeset
|
1466 # relying on Python GC |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1467 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1468 return util.buffer(util.mmapread(fp)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1469 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1470 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:
47235
diff
changeset
|
1471 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1472 return fp.read() |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1473 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1474 return fp.read(size) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49284
diff
changeset
|
1475 except FileNotFoundError: |
47169
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1476 return b'' |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1477 |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1478 def get_streams(self, max_linkrev, force_inline=False): |
51000
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1479 """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:
50999
diff
changeset
|
1480 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1481 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:
50999
diff
changeset
|
1482 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1483 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:
50999
diff
changeset
|
1484 to `max_linkrev`. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1485 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1486 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:
50999
diff
changeset
|
1487 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1488 It returns is a list of three-tuple: |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1489 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1490 [ |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1491 (filename, bytes_stream, stream_size), |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1492 … |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1493 ] |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50999
diff
changeset
|
1494 """ |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1495 n = len(self) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1496 index = self.index |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1497 while n > 0: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1498 linkrev = index[n - 1][4] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1499 if linkrev < max_linkrev: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1500 break |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1501 # note: this loop will rarely go through multiple iterations, since |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1502 # it only traverses commits created during the current streaming |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1503 # pull operation. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1504 # |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1505 # 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:
50659
diff
changeset
|
1506 # runtime of this. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1507 n = n - 1 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1508 if n == 0: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1509 # no data to send |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1510 return [] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1511 index_size = n * index.entry_size |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1512 data_size = self.end(n - 1) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1513 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1514 # 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:
50659
diff
changeset
|
1515 # 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:
50659
diff
changeset
|
1516 # 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:
50659
diff
changeset
|
1517 # we are done streaming. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1518 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1519 if self._inline: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1520 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1521 def get_stream(): |
51078
5ffee3cff8de
revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51077
diff
changeset
|
1522 with self.opener(self._indexfile, mode=b"r") as fp: |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1523 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1524 size = index_size + data_size |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1525 if size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1526 yield fp.read(size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1527 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1528 yield from util.filechunkiter(fp, limit=size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1529 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1530 inline_stream = get_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1531 next(inline_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1532 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1533 (self._indexfile, inline_stream, index_size + data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1534 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1535 elif force_inline: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1536 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1537 def get_stream(): |
51015
720e5a5f2b95
stream-clone: use `revlog.reading` in `revlog.get_streams`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51013
diff
changeset
|
1538 with self.reading(): |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1539 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1540 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1541 for rev in range(n): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1542 idx = self.index.entry_binary(rev) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1543 if rev == 0 and self._docket is None: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1544 # re-inject the inline flag |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1545 header = self._format_flags |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1546 header |= self._format_version |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1547 header |= FLAG_INLINE_DATA |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1548 header = self.index.pack_header(header) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1549 idx = header + idx |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1550 yield idx |
51084
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51083
diff
changeset
|
1551 yield self._inner.get_segment_for_revs(rev, rev)[1] |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1552 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1553 inline_stream = get_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1554 next(inline_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1555 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1556 (self._indexfile, inline_stream, index_size + data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1557 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1558 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1559 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1560 def get_index_stream(): |
51078
5ffee3cff8de
revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51077
diff
changeset
|
1561 with self.opener(self._indexfile, mode=b"r") as fp: |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1562 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1563 if index_size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1564 yield fp.read(index_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1565 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1566 yield from util.filechunkiter(fp, limit=index_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1567 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1568 def get_data_stream(): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1569 with self._datafp() as fp: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1570 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1571 if data_size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1572 yield fp.read(data_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1573 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1574 yield from util.filechunkiter(fp, limit=data_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1575 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1576 index_stream = get_index_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1577 next(index_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1578 data_stream = get_data_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1579 next(data_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1580 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1581 (self._datafile, data_stream, data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1582 (self._indexfile, index_stream, index_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1583 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1584 |
47402
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1585 def _loadindex(self, docket=None): |
47144
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1586 |
47171
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47170
diff
changeset
|
1587 new_header, mmapindexthreshold, force_nodemap = self._init_opts() |
47168
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
1588 |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
1589 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:
47239
diff
changeset
|
1590 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:
47239
diff
changeset
|
1591 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:
47239
diff
changeset
|
1592 entry_point = b'%s.i.a' % self.radix |
50658
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
|
1593 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
|
1594 entry_point = self._split_index_file |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
1595 else: |
47175
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
1596 entry_point = b'%s.i' % self.radix |
47168
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
1597 |
47402
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1598 if docket is not None: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1599 self._docket = docket |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1600 self._docket_file = entry_point |
47169
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47168
diff
changeset
|
1601 else: |
47402
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1602 self._initempty = True |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1603 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:
47399
diff
changeset
|
1604 if len(entry_data) > 0: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1605 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:
47399
diff
changeset
|
1606 self._initempty = False |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1607 else: |
47402
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1608 header = new_header |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1609 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1610 self._format_flags = header & ~0xFFFF |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1611 self._format_version = header & 0xFFFF |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1612 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1613 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:
47399
diff
changeset
|
1614 if supported_flags is None: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1615 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:
47399
diff
changeset
|
1616 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:
47399
diff
changeset
|
1617 raise error.RevlogError(msg) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1618 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:
47399
diff
changeset
|
1619 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:
47399
diff
changeset
|
1620 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:
47399
diff
changeset
|
1621 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:
47399
diff
changeset
|
1622 raise error.RevlogError(msg) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1623 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1624 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:
47399
diff
changeset
|
1625 self._inline = features[b'inline'](self._format_flags) |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1626 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:
51023
diff
changeset
|
1627 self._format_flags |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1628 ) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1629 self.feature_config.has_side_data = features[b'sidedata'] |
47402
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1630 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1631 if not features[b'docket']: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1632 self._indexfile = entry_point |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1633 index_data = entry_data |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1634 else: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1635 self._docket_file = entry_point |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1636 if self._initempty: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1637 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:
47399
diff
changeset
|
1638 else: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1639 self._docket = docketutil.parse_docket( |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1640 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:
47399
diff
changeset
|
1641 ) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1642 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
1643 if self._docket is not None: |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1644 self._indexfile = self._docket.index_filepath() |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1645 index_data = b'' |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1646 index_size = self._docket.index_end |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1647 if index_size > 0: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1648 index_data = self._get_data( |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1649 self._indexfile, mmapindexthreshold, size=index_size |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1650 ) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1651 if len(index_data) < index_size: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1652 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:
47235
diff
changeset
|
1653 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:
47235
diff
changeset
|
1654 raise error.RevlogError(msg) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
1655 |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1656 self._inline = False |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1657 # generaldelta implied by version 2 revlogs. |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1658 self.delta_config.general_delta = True |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1659 # 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:
47231
diff
changeset
|
1660 # main docket, so disable it for now. |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
1661 self._nodemap_file = None |
47175
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
1662 |
47324
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47294
diff
changeset
|
1663 if self._docket is not None: |
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47294
diff
changeset
|
1664 self._datafile = self._docket.data_filepath() |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1665 self._sidedatafile = self._docket.sidedata_filepath() |
47324
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47294
diff
changeset
|
1666 elif self.postfix is None: |
47175
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
1667 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:
47174
diff
changeset
|
1668 else: |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
1669 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:
47174
diff
changeset
|
1670 |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46779
diff
changeset
|
1671 self.nodeconstants = sha1nodeconstants |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46779
diff
changeset
|
1672 self.nullid = self.nodeconstants.nullid |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46779
diff
changeset
|
1673 |
41447
189e06b2d719
revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents:
41350
diff
changeset
|
1674 # sparse-revlog can't be on without general-delta (issue6056) |
51043
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
1675 if not self.delta_config.general_delta: |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
1676 self.delta_config.sparse_revlog = False |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
1677 |
39232
0a5b20c107a6
repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39231
diff
changeset
|
1678 self._storedeltachains = True |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30012
diff
changeset
|
1679 |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44310
diff
changeset
|
1680 devel_nodemap = ( |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1681 self._nodemap_file |
47144
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
1682 and force_nodemap |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
1683 and parse_index_v1_nodemap is not None |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44310
diff
changeset
|
1684 ) |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44310
diff
changeset
|
1685 |
44513
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44501
diff
changeset
|
1686 use_rust_index = False |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44501
diff
changeset
|
1687 if rustrevlog is not None: |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1688 if self._nodemap_file is not None: |
44513
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44501
diff
changeset
|
1689 use_rust_index = True |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44501
diff
changeset
|
1690 else: |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44501
diff
changeset
|
1691 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:
44501
diff
changeset
|
1692 |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
1693 self._parse_index = parse_index_v1 |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47136
diff
changeset
|
1694 if self._format_version == REVLOGV0: |
47038
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47037
diff
changeset
|
1695 self._parse_index = revlogv0.parse_index_v0 |
47173
ef7a8a1622ad
revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47172
diff
changeset
|
1696 elif self._format_version == REVLOGV2: |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
1697 self._parse_index = parse_index_v2 |
47266
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
1698 elif self._format_version == CHANGELOGV2: |
47270
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
1699 self._parse_index = parse_index_cl_v2 |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44310
diff
changeset
|
1700 elif devel_nodemap: |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
1701 self._parse_index = parse_index_v1_nodemap |
44513
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44501
diff
changeset
|
1702 elif use_rust_index: |
47036
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
1703 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
|
1704 try: |
47176
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47175
diff
changeset
|
1705 d = self._parse_index(index_data, self._inline) |
47425
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47414
diff
changeset
|
1706 index, chunkcache = d |
44320
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
1707 use_nodemap = ( |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
1708 not self._inline |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1709 and self._nodemap_file is not None |
50925
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50811
diff
changeset
|
1710 and hasattr(index, 'update_nodemap_data') |
44320
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
1711 ) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
1712 if use_nodemap: |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
1713 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:
44313
diff
changeset
|
1714 if nodemap_data is not None: |
44515
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44513
diff
changeset
|
1715 docket = nodemap_data[0] |
44954
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44516
diff
changeset
|
1716 if ( |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44516
diff
changeset
|
1717 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:
44516
diff
changeset
|
1718 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:
44516
diff
changeset
|
1719 ): |
44515
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44513
diff
changeset
|
1720 # no changelog tampering |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44513
diff
changeset
|
1721 self._nodemap_docket = docket |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44513
diff
changeset
|
1722 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
|
1723 except (ValueError, IndexError): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1724 raise error.RevlogError( |
47158
e1936ae27897
revlog: use revlog.display_id for corruption error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1725 _(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
|
1726 ) |
47425
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47414
diff
changeset
|
1727 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
|
1728 # revnum -> (chain-length, sum-delta-length) |
45779
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
1729 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
|
1730 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1731 return chunkcache |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1732 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1733 def _load_inner(self, chunk_cache): |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
1734 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:
51087
diff
changeset
|
1735 default_compression_header = None |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
1736 else: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
1737 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:
51087
diff
changeset
|
1738 |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1739 self._inner = _InnerRevlog( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1740 opener=self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1741 index=self.index, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1742 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:
51082
diff
changeset
|
1743 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:
51082
diff
changeset
|
1744 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:
51082
diff
changeset
|
1745 inline=self._inline, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1746 data_config=self.data_config, |
51090
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1747 delta_config=self.delta_config, |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
1748 feature_config=self.feature_config, |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1749 chunk_cache=chunk_cache, |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
1750 default_compression_header=default_compression_header, |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
1751 ) |
116
e484cd5ec282
Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents:
115
diff
changeset
|
1752 |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1753 def get_revlog(self): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1754 """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:
50659
diff
changeset
|
1755 return self |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50659
diff
changeset
|
1756 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
1757 @util.propertycache |
47073
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47072
diff
changeset
|
1758 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:
47072
diff
changeset
|
1759 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:
47072
diff
changeset
|
1760 |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47072
diff
changeset
|
1761 @util.propertycache |
47153
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47151
diff
changeset
|
1762 def display_id(self): |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47151
diff
changeset
|
1763 """The public facing "ID" of the revlog that we use in message""" |
49534
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49533
diff
changeset
|
1764 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:
49533
diff
changeset
|
1765 # 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:
49533
diff
changeset
|
1766 # to the user. |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49533
diff
changeset
|
1767 return self.target[1] |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49533
diff
changeset
|
1768 else: |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49533
diff
changeset
|
1769 return self.radix |
47153
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47151
diff
changeset
|
1770 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1771 def _datafp(self, mode=b'r'): |
35967
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35845
diff
changeset
|
1772 """file object for the revlog's data file""" |
47149
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
1773 return self.opener(self._datafile, mode=mode) |
35967
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35845
diff
changeset
|
1774 |
43440
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1775 def tiprev(self): |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1776 return len(self.index) - 1 |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1777 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1778 def tip(self): |
43440
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1779 return self.node(self.tiprev()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1780 |
24030
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
1781 def __contains__(self, rev): |
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
1782 return 0 <= rev < len(self) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1783 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1784 def __len__(self): |
38851
781b2720d2ac
index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38850
diff
changeset
|
1785 return len(self.index) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1786 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1787 def __iter__(self): |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
49248
diff
changeset
|
1788 return iter(range(len(self))) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1789 |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
1790 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
|
1791 """iterate over all rev in this revlog (from start to stop)""" |
39881
d63153611ed5
storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39879
diff
changeset
|
1792 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
|
1793 |
16374
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1794 def hasnode(self, node): |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1795 try: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1796 self.rev(node) |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1797 return True |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1798 except KeyError: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1799 return False |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1800 |
51001
39fa0b948f5a
revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51000
diff
changeset
|
1801 def _candelta(self, baserev, rev): |
36743
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1802 """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
|
1803 # 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
|
1804 # 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
|
1805 # 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
|
1806 # 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
|
1807 # rawtext contents) and the delta could be incompatible. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1808 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1809 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1810 ): |
36743
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1811 return False |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1812 return True |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1813 |
44445
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1814 def update_caches(self, transaction): |
51002
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51001
diff
changeset
|
1815 """update on disk cache |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51001
diff
changeset
|
1816 |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51001
diff
changeset
|
1817 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:
51001
diff
changeset
|
1818 commit.""" |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1819 if self._nodemap_file is not None: |
44445
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1820 if transaction is None: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1821 nodemaputil.update_persistent_nodemap(self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1822 else: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1823 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:
44363
diff
changeset
|
1824 |
16414
e8d37b78acfb
parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents:
16375
diff
changeset
|
1825 def clearcaches(self): |
51003
6c3798b4597f
revlog: document the `clearcaches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51002
diff
changeset
|
1826 """Clear in-memory caches""" |
29830
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1827 self._chainbasecache.clear() |
51098
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
1828 self._inner.clear_cache() |
27465
072a675c51f2
revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27449
diff
changeset
|
1829 self._pcache = {} |
44501
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1830 self._nodemap_docket = None |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43524
diff
changeset
|
1831 self.index.clearcaches() |
44501
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1832 # 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:
44491
diff
changeset
|
1833 # 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:
44491
diff
changeset
|
1834 use_nodemap = ( |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1835 not self._inline |
47164
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1836 and self._nodemap_file is not None |
50925
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50811
diff
changeset
|
1837 and hasattr(self.index, 'update_nodemap_data') |
44501
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1838 ) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1839 if use_nodemap: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1840 nodemap_data = nodemaputil.persisted_data(self) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1841 if nodemap_data is not None: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1842 self._nodemap_docket = nodemap_data[0] |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44491
diff
changeset
|
1843 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
|
1844 |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
1845 def rev(self, node): |
51004
ccddd2f54013
revlog: document the `rev` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51003
diff
changeset
|
1846 """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
|
1847 try: |
43553
2da51e292734
index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43552
diff
changeset
|
1848 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
|
1849 except TypeError: |
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
21752
diff
changeset
|
1850 raise |
39773
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39769
diff
changeset
|
1851 except error.RevlogError: |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43524
diff
changeset
|
1852 # parsers.c radix tree lookup failed |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1853 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1854 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1855 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1856 ): |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43524
diff
changeset
|
1857 raise error.WdirUnsupported |
47155
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47153
diff
changeset
|
1858 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
|
1859 |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1860 # Accessors for index entries. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1861 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1862 # 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
|
1863 # are flags. |
2072 | 1864 def start(self, rev): |
5006
c2febf5420e9
revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents:
5005
diff
changeset
|
1865 return int(self.index[rev][0] >> 16) |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1866 |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1867 def sidedata_cut_off(self, rev): |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1868 sd_cut_off = self.index[rev][8] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1869 if sd_cut_off != 0: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1870 return sd_cut_off |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1871 # 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:
47387
diff
changeset
|
1872 # 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:
47387
diff
changeset
|
1873 # previous-size) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1874 # |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1875 # 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:
47387
diff
changeset
|
1876 # In the meantime, we need this. |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1877 while 0 <= rev: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1878 e = self.index[rev] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1879 if e[9] != 0: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1880 return e[8] + e[9] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1881 rev -= 1 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1882 return 0 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
1883 |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1884 def flags(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1885 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
|
1886 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1887 def length(self, rev): |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1888 return self.index[rev][1] |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1889 |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
1890 def sidedata_length(self, rev): |
51058
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51057
diff
changeset
|
1891 if not self.feature_config.has_side_data: |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
1892 return 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
1893 return self.index[rev][9] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
1894 |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1895 def rawsize(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1896 """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
|
1897 l = self.index[rev][2] |
38177
7fa3408f83ef
revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents:
38169
diff
changeset
|
1898 if l >= 0: |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1899 return l |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1900 |
42768
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42732
diff
changeset
|
1901 t = self.rawdata(rev) |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1902 return len(t) |
31856
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1903 |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1904 def size(self, rev): |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1905 """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
|
1906 # 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
|
1907 # 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
|
1908 flags = self.flags(rev) |
42730
92ac6b1697a7
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42729
diff
changeset
|
1909 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
|
1910 return self.rawsize(rev) |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1911 |
48529
c514936d92b4
revlog: remove deprecated APIs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48283
diff
changeset
|
1912 return len(self.revision(rev)) |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1913 |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1914 def fast_rank(self, rev): |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1915 """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:
48681
diff
changeset
|
1916 |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1917 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:
48681
diff
changeset
|
1918 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:
48681
diff
changeset
|
1919 `ancestors(r)`, `r` included. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1920 |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1921 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:
48681
diff
changeset
|
1922 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:
48681
diff
changeset
|
1923 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:
48681
diff
changeset
|
1924 """ |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1925 rank = self.index[rev][ENTRY_RANK] |
48851
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48769
diff
changeset
|
1926 if self._format_version != CHANGELOGV2 or rank == RANK_UNKNOWN: |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1927 return None |
48851
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48769
diff
changeset
|
1928 if rev == nullrev: |
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48769
diff
changeset
|
1929 return 0 # convention |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1930 return rank |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1931 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
1932 def chainbase(self, rev): |
29830
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1933 base = self._chainbasecache.get(rev) |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1934 if base is not None: |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1935 return base |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1936 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
1937 index = self.index |
38169
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38168
diff
changeset
|
1938 iterrev = rev |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38168
diff
changeset
|
1939 base = index[iterrev][3] |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38168
diff
changeset
|
1940 while base != iterrev: |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38168
diff
changeset
|
1941 iterrev = base |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38168
diff
changeset
|
1942 base = index[iterrev][3] |
29830
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1943 |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29829
diff
changeset
|
1944 self._chainbasecache[rev] = base |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
1945 return base |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1946 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1947 def linkrev(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1948 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
|
1949 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1950 def parentrevs(self, rev): |
32403
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32393
diff
changeset
|
1951 try: |
35521
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35345
diff
changeset
|
1952 entry = self.index[rev] |
32403
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32393
diff
changeset
|
1953 except IndexError: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32393
diff
changeset
|
1954 if rev == wdirrev: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32393
diff
changeset
|
1955 raise error.WdirUnsupported |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32393
diff
changeset
|
1956 raise |
47504
411dc27fd9fd
corruption: backout changeset 49fd21f32695 (issue6528)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
1957 |
51062
14574a41a7a7
revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51061
diff
changeset
|
1958 if self.feature_config.canonical_parent_order and entry[5] == nullrev: |
49012
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1959 return entry[6], entry[5] |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1960 else: |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1961 return entry[5], entry[6] |
35521
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35345
diff
changeset
|
1962 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
1963 # 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:
40056
diff
changeset
|
1964 _uncheckedparentrevs = parentrevs |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
1965 |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1966 def node(self, rev): |
32443
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32403
diff
changeset
|
1967 try: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32403
diff
changeset
|
1968 return self.index[rev][7] |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32403
diff
changeset
|
1969 except IndexError: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32403
diff
changeset
|
1970 if rev == wdirrev: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32403
diff
changeset
|
1971 raise error.WdirUnsupported |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32403
diff
changeset
|
1972 raise |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1973 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1974 # Derived from index values. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1975 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1976 def end(self, rev): |
46710
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
1977 return self.start(rev) + self.length(rev) |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1978 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1979 def parents(self, node): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1980 i = self.index |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1981 d = i[self.rev(node)] |
49012
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1982 # inline node() to avoid function call overhead |
51062
14574a41a7a7
revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51061
diff
changeset
|
1983 if self.feature_config.canonical_parent_order and d[5] == self.nullid: |
49012
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1984 return i[d[6]][7], i[d[5]][7] |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1985 else: |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
48946
diff
changeset
|
1986 return i[d[5]][7], i[d[6]][7] |
30287
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1987 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
1988 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
|
1989 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
|
1990 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
1991 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
|
1992 chaininfocache = self._chaininfocache |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
1993 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
|
1994 return chaininfocache[rev] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
1995 index = self.index |
51043
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
1996 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
|
1997 iterrev = rev |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
1998 e = index[iterrev] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
1999 clen = 0 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2000 compresseddeltalen = 0 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2001 while iterrev != e[3]: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2002 clen += 1 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2003 compresseddeltalen += e[1] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2004 if generaldelta: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2005 iterrev = e[3] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2006 else: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2007 iterrev -= 1 |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2008 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
|
2009 t = chaininfocache[iterrev] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2010 clen += t[0] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2011 compresseddeltalen += t[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2012 break |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2013 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
|
2014 else: |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2015 # 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
|
2016 # 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
|
2017 compresseddeltalen += e[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2018 r = (clen, compresseddeltalen) |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2019 chaininfocache[rev] = r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2020 return r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2021 |
27468
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
2022 def _deltachain(self, rev, stoprev=None): |
51092
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
2023 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
|
2024 |
18081
f88c60e740a1
revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents:
17975
diff
changeset
|
2025 def ancestors(self, revs, stoprev=0, inclusive=False): |
40738
8947f49daaa8
revlog: update the docstring of `ancestors` to match reality
Boris Feld <boris.feld@octobus.net>
parents:
40627
diff
changeset
|
2026 """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
|
2027 Does not generate revs lower than stoprev. |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2028 |
18090
9abc55ef85b5
revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents:
18083
diff
changeset
|
2029 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
|
2030 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
2031 # 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:
40056
diff
changeset
|
2032 revs = list(revs) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
2033 checkrev = self.node |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
2034 for r in revs: |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
2035 checkrev(r) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40056
diff
changeset
|
2036 # and we're sure ancestors aren't filtered as well |
41115
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41086
diff
changeset
|
2037 |
47269
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
2038 if rustancestor is not None and self.index.rust_ext_compat: |
42452
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42446
diff
changeset
|
2039 lazyancestors = rustancestor.LazyAncestors |
41115
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41086
diff
changeset
|
2040 arg = self.index |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41086
diff
changeset
|
2041 else: |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41086
diff
changeset
|
2042 lazyancestors = ancestor.lazyancestors |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41086
diff
changeset
|
2043 arg = self._uncheckedparentrevs |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41086
diff
changeset
|
2044 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
|
2045 |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16866
diff
changeset
|
2046 def descendants(self, revs): |
39999
0b24fcd88066
dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39908
diff
changeset
|
2047 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
|
2048 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2049 def findcommonmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2050 """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
|
2051 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
|
2052 tuple: |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2053 |
15835
fa15869bf95c
revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15827
diff
changeset
|
2054 ::common, (::heads) - (::common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2055 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2056 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
|
2057 topologically sorted. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2058 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2059 '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
|
2060 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
|
2061 supplied, uses nullid.""" |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2062 if common is None: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2063 common = [self.nullid] |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2064 if heads is None: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2065 heads = self.heads() |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2066 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2067 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
|
2068 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
|
2069 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2070 # we want the ancestors, but inclusive |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48928
diff
changeset
|
2071 class lazyset: |
20073
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2072 def __init__(self, lazyvalues): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2073 self.addedvalues = set() |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2074 self.lazyvalues = lazyvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2075 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2076 def __contains__(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2077 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
|
2078 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2079 def __iter__(self): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2080 added = self.addedvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2081 for r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2082 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2083 for r in self.lazyvalues: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2084 if not r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2085 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2086 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2087 def add(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2088 self.addedvalues.add(value) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2089 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2090 def update(self, values): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2091 self.addedvalues.update(values) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2092 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2093 has = lazyset(self.ancestors(common)) |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2094 has.add(nullrev) |
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2095 has.update(common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2096 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2097 # 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
|
2098 missing = set() |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
2099 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
|
2100 while visit: |
16803
107a3270a24a
cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents:
16786
diff
changeset
|
2101 r = visit.popleft() |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2102 if r in missing: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2103 continue |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2104 else: |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2105 missing.add(r) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2106 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
|
2107 if p not in has: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2108 visit.append(p) |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2109 missing = list(missing) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2110 missing.sort() |
30391
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30289
diff
changeset
|
2111 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
|
2112 |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2113 def incrementalmissingrevs(self, common=None): |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2114 """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
|
2115 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
|
2116 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
|
2117 object. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2118 |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2119 '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
|
2120 nullrev. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2121 """ |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2122 if common is None: |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2123 common = [nullrev] |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2124 |
47269
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
2125 if rustancestor is not None and self.index.rust_ext_compat: |
42452
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42446
diff
changeset
|
2126 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
|
2127 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
|
2128 |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2129 def findmissingrevs(self, common=None, heads=None): |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2130 """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
|
2131 are not ancestors of common. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2132 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2133 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
|
2134 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
|
2135 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2136 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
|
2137 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
|
2138 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2139 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
|
2140 topologically sorted. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2141 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2142 '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
|
2143 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
|
2144 supplied, uses nullid.""" |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2145 if common is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2146 common = [nullrev] |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2147 if heads is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2148 heads = self.headrevs() |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2149 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2150 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2151 return inc.missingancestors(heads) |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2152 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2153 def findmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2154 """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
|
2155 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2156 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
|
2157 satisfies the following constraints: |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2158 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2159 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
|
2160 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
|
2161 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2162 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
|
2163 topologically sorted. |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2164 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2165 '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
|
2166 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
|
2167 supplied, uses nullid.""" |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2168 if common is None: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2169 common = [self.nullid] |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2170 if heads is None: |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2171 heads = self.heads() |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2172 |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2173 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
|
2174 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
|
2175 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2176 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2177 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
|
2178 |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2179 def nodesbetween(self, roots=None, heads=None): |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2180 """Return a topological path from 'roots' to 'heads'. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2181 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2182 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
|
2183 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
|
2184 these constraints: |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2185 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2186 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
|
2187 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
|
2188 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2189 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
|
2190 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
|
2191 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
|
2192 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2193 '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
|
2194 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
|
2195 '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
|
2196 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2197 '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
|
2198 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
|
2199 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
|
2200 nonodes = ([], [], []) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2201 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
|
2202 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
|
2203 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
|
2204 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2205 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
|
2206 else: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2207 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
|
2208 lowestrev = nullrev |
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
2209 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
|
2210 # We want _all_ the nodes! |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2211 return ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2212 [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
|
2213 [self.nullid], |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2214 list(self.heads()), |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2215 ) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2216 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
|
2217 # 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
|
2218 # node. |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2219 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
|
2220 # 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
|
2221 ancestors = None |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2222 # 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
|
2223 heads = {} |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2224 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
|
2225 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
|
2226 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
|
2227 return nonodes |
8464
7af92e70bb25
revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8453
diff
changeset
|
2228 ancestors = set() |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2229 # 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
|
2230 # 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
|
2231 # find from roots. |
14219
c33427080671
revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
2232 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
|
2233 # 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
|
2234 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
|
2235 # 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
|
2236 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
|
2237 while nodestotag: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2238 # 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
|
2239 n = nodestotag.pop() |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2240 # Never tag nullid |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2241 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
|
2242 continue |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2243 # 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
|
2244 # 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
|
2245 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
|
2246 if r >= lowestrev: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2247 if n not in ancestors: |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2248 # 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
|
2249 # 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
|
2250 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
|
2251 # 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
|
2252 nodestotag.update( |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2253 [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
|
2254 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2255 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
|
2256 # 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
|
2257 # any other heads. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2258 heads.pop(n) |
1459
106fdec8e1fb
Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
2259 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
|
2260 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2261 # 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
|
2262 # 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
|
2263 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2264 # 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
|
2265 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
|
2266 # 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
|
2267 # 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
|
2268 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2269 # Filter out roots that aren't ancestors of heads |
30391
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30289
diff
changeset
|
2270 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
|
2271 # 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
|
2272 if roots: |
30391
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30289
diff
changeset
|
2273 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
|
2274 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2275 # 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
|
2276 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2277 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2278 # 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
|
2279 # 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
|
2280 lowestrev = nullrev |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2281 roots = [self.nullid] |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2282 # Transform our roots list into a set. |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2283 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
|
2284 # 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
|
2285 # '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
|
2286 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
|
2287 # 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
|
2288 orderedout = [] |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2289 # Don't start at nullid since we don't want nullid in our output list, |
17483 | 2290 # 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
|
2291 # 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
|
2292 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
|
2293 n = self.node(r) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2294 isdescendant = False |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2295 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
|
2296 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2297 elif n in descendants: |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2298 # n is already a descendant |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2299 isdescendant = True |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2300 # 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
|
2301 # 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
|
2302 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
|
2303 # 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
|
2304 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2305 # 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
|
2306 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
|
2307 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
|
2308 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2309 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2310 # 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
|
2311 # 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
|
2312 # up there, remember?) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2313 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
|
2314 descendants.add(n) |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2315 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2316 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
|
2317 # 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
|
2318 orderedout.append(n) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2319 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
|
2320 # 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
|
2321 # from roots. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2322 # 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
|
2323 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
|
2324 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
|
2325 # 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
|
2326 # 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
|
2327 # 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
|
2328 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
|
2329 # 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
|
2330 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
|
2331 heads.pop(p, None) |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
2332 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
|
2333 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
|
2334 assert orderedout |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2335 assert roots |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2336 assert heads |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2337 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
|
2338 |
41275
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2339 def headrevs(self, revs=None): |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2340 if revs is None: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2341 try: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2342 return self.index.headrevs() |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2343 except AttributeError: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2344 return self._headrevs() |
47269
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
2345 if rustdagop is not None and self.index.rust_ext_compat: |
42452
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42446
diff
changeset
|
2346 return rustdagop.headrevs(self.index, revs) |
41763
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41689
diff
changeset
|
2347 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
|
2348 |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
2349 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
|
2350 return self.index.computephasesmapsets(roots) |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
2351 |
17674
e69274f8d444
clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17673
diff
changeset
|
2352 def _headrevs(self): |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2353 count = len(self) |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2354 if not count: |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2355 return [nullrev] |
17673
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2356 # 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
|
2357 ishead = [0] * (count + 1) |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2358 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
|
2359 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
|
2360 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
|
2361 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
|
2362 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
|
2363 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
|
2364 |
3923
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3755
diff
changeset
|
2365 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
|
2366 """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
|
2367 |
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2368 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
|
2369 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
|
2370 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
|
2371 as if they had no children |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2372 """ |
4991
9c8c42bcf17a
revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents:
4990
diff
changeset
|
2373 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
|
2374 if not len(self): |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2375 return [self.nullid] |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2376 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
|
2377 |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2378 if start is None: |
40000
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2379 start = nullrev |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2380 else: |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2381 start = self.rev(start) |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2382 |
44452
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44445
diff
changeset
|
2383 stoprevs = {self.rev(n) for n in stop or []} |
40000
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2384 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2385 revs = dagop.headrevssubset( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2386 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2387 ) |
40000
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2388 |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39999
diff
changeset
|
2389 return [self.node(rev) for rev in revs] |
370 | 2390 |
2391 def children(self, node): | |
1083 | 2392 """find the children of a given node""" |
370 | 2393 c = [] |
2394 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
|
2395 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
|
2396 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
|
2397 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
|
2398 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
|
2399 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
|
2400 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
|
2401 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
|
2402 c.append(self.node(r)) |
370 | 2403 return c |
515 | 2404 |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2405 def commonancestorsheads(self, a, b): |
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2406 """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
|
2407 a, b = self.rev(a), self.rev(b) |
38512
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2408 ancs = self._commonancestorsheads(a, b) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2409 return pycompat.maplist(self.node, ancs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2410 |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2411 def _commonancestorsheads(self, *revs): |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2412 """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
|
2413 try: |
38512
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2414 ancs = self.index.commonancestorsheads(*revs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2415 except (AttributeError, OverflowError): # C implementation failed |
38512
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2416 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38511
diff
changeset
|
2417 return ancs |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2418 |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
2419 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
|
2420 """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
|
2421 |
160da69ba1bf
revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38663
diff
changeset
|
2422 A revision is considered an ancestor of itself.""" |
38514
cc3543c87de5
revlog: reuse 'descendant' implemention in 'isancestor'
Boris Feld <boris.feld@octobus.net>
parents:
38513
diff
changeset
|
2423 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
|
2424 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
|
2425 |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2426 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
|
2427 """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
|
2428 |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2429 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
|
2430 |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2431 The implementation of this is trivial but the use of |
42446
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2432 reachableroots is not.""" |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2433 if a == nullrev: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2434 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2435 elif a == b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2436 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2437 elif a > b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2438 return False |
42446
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2439 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
|
2440 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2441 def reachableroots(self, minroot, heads, roots, includepath=False): |
43779
2e30d7df4809
revlog: fix revset in reachableroots docstring
Jun Wu <quark@fb.com>
parents:
43619
diff
changeset
|
2442 """return (heads(::(<roots> and <roots>::<heads>))) |
42446
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2443 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2444 If includepath is True, return (<roots>::<heads>).""" |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2445 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2446 return self.index.reachableroots2( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2447 minroot, heads, roots, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2448 ) |
42446
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2449 except AttributeError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2450 return dagop._reachablerootspure( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2451 self.parentrevs, minroot, roots, heads, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2452 ) |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
2453 |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2454 def ancestor(self, a, b): |
22389
94f77624dbb5
comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents:
22381
diff
changeset
|
2455 """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
|
2456 |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
2457 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
|
2458 try: |
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2459 ancs = self.index.ancestors(a, b) |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2460 except (AttributeError, OverflowError): |
18988
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2461 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
|
2462 if ancs: |
3605d4e7e618
revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents:
18986
diff
changeset
|
2463 # choose a consistent winner when there's a tie |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2464 return min(map(self.node, ancs)) |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2465 return self.nullid |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
2466 |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2467 def _match(self, id): |
16762
93f8b9565257
revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents:
16686
diff
changeset
|
2468 if isinstance(id, int): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2469 # 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
|
2470 return self.node(id) |
47042
c5e1cc0b4c77
core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents:
47041
diff
changeset
|
2471 if len(id) == self.nodeconstants.nodelen: |
3438 | 2472 # possibly a binary node |
2473 # odds of a binary node being all hex in ASCII are 1 in 10**25 | |
2474 try: | |
2475 node = id | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2476 self.rev(node) # quick search the index |
3438 | 2477 return node |
39775
974592474dee
revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39774
diff
changeset
|
2478 except error.LookupError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2479 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
|
2480 try: |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2481 # str(rev) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2482 rev = int(id) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2483 if b"%d" % rev != id: |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2484 raise ValueError |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2485 if rev < 0: |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2486 rev = len(self) + rev |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2487 if rev < 0 or rev >= len(self): |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2488 raise ValueError |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2489 return self.node(rev) |
469 | 2490 except (ValueError, OverflowError): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2491 pass |
47041
a407fe56d6e8
core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents:
47038
diff
changeset
|
2492 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
|
2493 try: |
3438 | 2494 # a full hex nodeid? |
2495 node = bin(id) | |
7874
d812029cda85
cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7873
diff
changeset
|
2496 self.rev(node) |
3157
4fe41a9e4591
optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3156
diff
changeset
|
2497 return node |
49248
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
49247
diff
changeset
|
2498 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
|
2499 pass |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2500 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2501 def _partialmatch(self, id): |
37449
a0d71618074f
revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents:
37443
diff
changeset
|
2502 # we don't care wdirfilenodeids as they should be always full hash |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2503 maybewdir = self.nodeconstants.wdirhex.startswith(id) |
47294
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2504 ambiguous = False |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2505 try: |
30391
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30289
diff
changeset
|
2506 partial = self.index.partialmatch(id) |
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30289
diff
changeset
|
2507 if partial and self.hasnode(partial): |
32684
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32659
diff
changeset
|
2508 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32659
diff
changeset
|
2509 # single 'ff...' match in radix tree, ambiguous with wdir |
47294
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2510 ambiguous = True |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2511 else: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2512 return partial |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2513 elif maybewdir: |
32684
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32659
diff
changeset
|
2514 # 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:
32659
diff
changeset
|
2515 raise error.WdirUnsupported |
47294
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2516 else: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2517 return None |
39773
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39769
diff
changeset
|
2518 except error.RevlogError: |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2519 # 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
|
2520 # 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
|
2521 if not getattr(self, 'filteredrevs', None): |
47294
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2522 ambiguous = True |
19471
fd1bb7c1be78
revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents:
19326
diff
changeset
|
2523 # 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
|
2524 except (AttributeError, ValueError): |
49415
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49306
diff
changeset
|
2525 # 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
|
2526 pass |
47294
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2527 if ambiguous: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2528 raise error.AmbiguousPrefixLookupError( |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47285
diff
changeset
|
2529 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:
47285
diff
changeset
|
2530 ) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2531 |
13258
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2532 if id in self._pcache: |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2533 return self._pcache[id] |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2534 |
37819
ee3d58b4a47f
revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents:
37767
diff
changeset
|
2535 if len(id) <= 40: |
49247
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49246
diff
changeset
|
2536 # hex(node)[:...] |
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49246
diff
changeset
|
2537 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
|
2538 try: |
49415
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49306
diff
changeset
|
2539 # 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:
49306
diff
changeset
|
2540 # 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:
49306
diff
changeset
|
2541 if len(id) % 2 > 0: |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49306
diff
changeset
|
2542 if not (id[-1] in hexdigits): |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49306
diff
changeset
|
2543 return None |
49246
31602d471b60
revlog: make round-down pattern clearer
Manuel Jacob <me@manueljacob.de>
parents:
49227
diff
changeset
|
2544 prefix = bin(id[:l]) |
49248
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
49247
diff
changeset
|
2545 except binascii.Error: |
49247
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49246
diff
changeset
|
2546 pass |
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49246
diff
changeset
|
2547 else: |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
2548 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
|
2549 nl = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2550 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
|
2551 ] |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2552 if self.nodeconstants.nullhex.startswith(id): |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2553 nl.append(self.nullid) |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2554 if len(nl) > 0: |
32684
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32659
diff
changeset
|
2555 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
|
2556 self._pcache[id] = nl[0] |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2557 return nl[0] |
39774
4a2466b2a434
revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39773
diff
changeset
|
2558 raise error.AmbiguousPrefixLookupError( |
47159
1ec64f59dc27
revlog: use revlog.display_id in ambiguity errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
2559 id, self.display_id, _(b'ambiguous identifier') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2560 ) |
32684
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32659
diff
changeset
|
2561 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32659
diff
changeset
|
2562 raise error.WdirUnsupported |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2563 return None |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2564 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2565 def lookup(self, id): |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2566 """locate a node based on: |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45870
diff
changeset
|
2567 - revision number or str(revision number) |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45870
diff
changeset
|
2568 - 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
|
2569 """ |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2570 n = self._match(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2571 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
|
2572 return n |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2573 n = self._partialmatch(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2574 if n: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2575 return n |
515 | 2576 |
47155
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47153
diff
changeset
|
2577 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
|
2578 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2579 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
|
2580 """Find the shortest unambiguous prefix that matches node.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2581 |
37863
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37862
diff
changeset
|
2582 def isvalid(prefix): |
34250
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2583 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
|
2584 matchednode = self._partialmatch(prefix) |
39831
7a9e2d85f475
revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents:
39778
diff
changeset
|
2585 except error.AmbiguousPrefixLookupError: |
34250
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2586 return False |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2587 except error.WdirUnsupported: |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2588 # single 'ff...' match |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2589 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
|
2590 if matchednode is None: |
47155
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47153
diff
changeset
|
2591 raise error.LookupError(node, self.display_id, _(b'no node')) |
37970
76e933e0ccc9
shortest: remove unnecessary check for revnum in isvalid()
Martin von Zweigbergk <martinvonz@google.com>
parents:
37969
diff
changeset
|
2592 return True |
34250
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2593 |
37968
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2594 def maybewdir(prefix): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2595 return all(c == b'f' for c in pycompat.iterbytestr(prefix)) |
37968
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2596 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2597 hexnode = hex(node) |
37968
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2598 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2599 def disambiguate(hexnode, minlength): |
37971
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
37970
diff
changeset
|
2600 """Disambiguate against wdirid.""" |
45053
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44954
diff
changeset
|
2601 for length in range(minlength, len(hexnode) + 1): |
37968
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2602 prefix = hexnode[:length] |
37971
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
37970
diff
changeset
|
2603 if not maybewdir(prefix): |
37968
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2604 return prefix |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2605 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2606 if not getattr(self, 'filteredrevs', None): |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2607 try: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2608 length = max(self.index.shortest(node), minlength) |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2609 return disambiguate(hexnode, length) |
39773
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39769
diff
changeset
|
2610 except error.RevlogError: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2611 if node != self.nodeconstants.wdirid: |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
2612 raise error.LookupError( |
47155
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47153
diff
changeset
|
2613 node, self.display_id, _(b'no node') |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
2614 ) |
37968
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2615 except AttributeError: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2616 # Fall through to pure code |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2617 pass |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37865
diff
changeset
|
2618 |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2619 if node == self.nodeconstants.wdirid: |
45053
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44954
diff
changeset
|
2620 for length in range(minlength, len(hexnode) + 1): |
37969
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
37968
diff
changeset
|
2621 prefix = hexnode[:length] |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
37968
diff
changeset
|
2622 if isvalid(prefix): |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
37968
diff
changeset
|
2623 return prefix |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
37968
diff
changeset
|
2624 |
45053
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44954
diff
changeset
|
2625 for length in range(minlength, len(hexnode) + 1): |
37863
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37862
diff
changeset
|
2626 prefix = hexnode[:length] |
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37862
diff
changeset
|
2627 if isvalid(prefix): |
37969
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
37968
diff
changeset
|
2628 return disambiguate(hexnode, length) |
34250
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34148
diff
changeset
|
2629 |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2630 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
|
2631 """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
|
2632 |
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
2633 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
|
2634 """ |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2635 p1, p2 = self.parents(node) |
39877
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39872
diff
changeset
|
2636 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
|
2637 |
11929
1839a7518b0d
revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
11928
diff
changeset
|
2638 def deltaparent(self, rev): |
14195
0013d3eeb826
revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents:
14164
diff
changeset
|
2639 """return deltaparent of the given revision""" |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2640 base = self.index[rev][3] |
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2641 if base == rev: |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2642 return nullrev |
51043
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
2643 elif self.delta_config.general_delta: |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2644 return base |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2645 else: |
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2646 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
|
2647 |
39149
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39147
diff
changeset
|
2648 def issnapshot(self, rev): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45870
diff
changeset
|
2649 """tells whether rev is a snapshot""" |
51090
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2650 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:
51089
diff
changeset
|
2651 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:
51089
diff
changeset
|
2652 return ret |
39149
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39147
diff
changeset
|
2653 |
39152
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39150
diff
changeset
|
2654 def snapshotdepth(self, rev): |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39150
diff
changeset
|
2655 """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:
39150
diff
changeset
|
2656 if not self.issnapshot(rev): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2657 raise error.ProgrammingError(b'revision %d not a snapshot') |
51092
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
2658 return len(self._inner._deltachain(rev)[0]) - 1 |
39152
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39150
diff
changeset
|
2659 |
1941
7518823709a2
revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1853
diff
changeset
|
2660 def revdiff(self, rev1, rev2): |
31753
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31752
diff
changeset
|
2661 """return or calculate a delta between two revisions |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31752
diff
changeset
|
2662 |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31752
diff
changeset
|
2663 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:
31752
diff
changeset
|
2664 revlog data directly. So this function needs raw revision data. |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31752
diff
changeset
|
2665 """ |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2666 if rev1 != nullrev and self.deltaparent(rev2) == rev1: |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
2667 return bytes(self._inner._chunk(rev2)) |
5005
72082bfced9a
revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents:
5004
diff
changeset
|
2668 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2669 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
|
2670 |
51019
33d2f0164d0d
revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51017
diff
changeset
|
2671 def revision(self, nodeorrev): |
16435
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2672 """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
|
2673 number. |
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2674 """ |
51019
33d2f0164d0d
revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51017
diff
changeset
|
2675 return self._revisiondata(nodeorrev) |
42718
389233789952
revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42688
diff
changeset
|
2676 |
51021
299b7b5440db
revlog: drop the df argument to `sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51020
diff
changeset
|
2677 def sidedata(self, nodeorrev): |
42980
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42879
diff
changeset
|
2678 """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:
42879
diff
changeset
|
2679 |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42879
diff
changeset
|
2680 This function currently return a dictionary. However, more advanced |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42879
diff
changeset
|
2681 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:
42879
diff
changeset
|
2682 efficient/lazy code. |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42879
diff
changeset
|
2683 """ |
47382
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47328
diff
changeset
|
2684 # deal with <nodeorrev> argument type |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47328
diff
changeset
|
2685 if isinstance(nodeorrev, int): |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47328
diff
changeset
|
2686 rev = nodeorrev |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47328
diff
changeset
|
2687 else: |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47328
diff
changeset
|
2688 rev = self.rev(nodeorrev) |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47328
diff
changeset
|
2689 return self._sidedata(rev) |
42980
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42879
diff
changeset
|
2690 |
51094
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2691 def _rawtext(self, node, rev): |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2692 """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:
51093
diff
changeset
|
2693 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2694 returns (rev, rawtext, validated) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2695 """ |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2696 # 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:
51093
diff
changeset
|
2697 # 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:
51093
diff
changeset
|
2698 if self._inner._revisioncache: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2699 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:
51093
diff
changeset
|
2700 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:
51093
diff
changeset
|
2701 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2702 if rev is None: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2703 rev = self.rev(node) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2704 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2705 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:
51093
diff
changeset
|
2706 |
51023
8520db304f01
revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51022
diff
changeset
|
2707 def _revisiondata(self, nodeorrev, raw=False): |
42790
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42789
diff
changeset
|
2708 # deal with <nodeorrev> argument type |
16375
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2709 if isinstance(nodeorrev, int): |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2710 rev = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2711 node = self.node(rev) |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2712 else: |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2713 node = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2714 rev = None |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2715 |
42790
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42789
diff
changeset
|
2716 # fast path the special `nullid` rev |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2717 if node == self.nullid: |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47384
diff
changeset
|
2718 return b"" |
42789
bf070a59546a
revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42788
diff
changeset
|
2719 |
43979
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43957
diff
changeset
|
2720 # ``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:
43957
diff
changeset
|
2721 # revision or might need to be processed to retrieve the revision. |
51023
8520db304f01
revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51022
diff
changeset
|
2722 rev, rawtext, validated = self._rawtext(node, rev) |
42792
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2723 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2724 if raw and validated: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2725 # 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:
42791
diff
changeset
|
2726 # text is cached, we can exit early. |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47384
diff
changeset
|
2727 return rawtext |
42792
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2728 if rev is None: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2729 rev = self.rev(node) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2730 # the revlog's flag for this revision |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2731 # (usually alter its state or content) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2732 flags = self.flags(rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2733 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2734 if validated and flags == REVIDX_DEFAULT_FLAGS: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2735 # no extra flags set, no flag processor runs, text = rawtext |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47384
diff
changeset
|
2736 return rawtext |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2737 |
42879
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42876
diff
changeset
|
2738 if raw: |
42992
dff95420480f
flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42991
diff
changeset
|
2739 validatehash = flagutil.processflagsraw(self, rawtext, flags) |
42879
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42876
diff
changeset
|
2740 text = rawtext |
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42876
diff
changeset
|
2741 else: |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2742 r = flagutil.processflagsread(self, rawtext, flags) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2743 text, validatehash = r |
42792
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2744 if validatehash: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2745 self.checkhash(text, node, rev=rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2746 if not validated: |
51093
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
2747 self._inner._revisioncache = (node, rev, rawtext) |
42792
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2748 |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47384
diff
changeset
|
2749 return text |
42792
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42791
diff
changeset
|
2750 |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2751 def _sidedata(self, rev): |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2752 """Return the sidedata for a given revision number.""" |
51095
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
2753 sidedata_end = None |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
2754 if self._docket is not None: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
2755 sidedata_end = self._docket.sidedata_end |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
2756 return self._inner.sidedata(rev, sidedata_end) |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2757 |
51020
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51019
diff
changeset
|
2758 def rawdata(self, nodeorrev): |
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51019
diff
changeset
|
2759 """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:
51019
diff
changeset
|
2760 return self._revisiondata(nodeorrev, raw=True) |
42719
415e4136d326
rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42718
diff
changeset
|
2761 |
22785
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2762 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
|
2763 """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
|
2764 |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2765 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
|
2766 as needed. |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2767 """ |
39877
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39872
diff
changeset
|
2768 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
|
2769 |
30584
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30543
diff
changeset
|
2770 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30543
diff
changeset
|
2771 """Check node hash integrity. |
19624
55749cb14d24
revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents:
19471
diff
changeset
|
2772 |
30584
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30543
diff
changeset
|
2773 Available as a function so that subclasses can extend hash mismatch |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30543
diff
changeset
|
2774 behaviors as needed. |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30543
diff
changeset
|
2775 """ |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2776 try: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2777 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
|
2778 p1, p2 = self.parents(node) |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2779 if node != self.hash(text, p1, p2): |
40054
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40052
diff
changeset
|
2780 # 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:
40052
diff
changeset
|
2781 # 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:
40052
diff
changeset
|
2782 # 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:
40052
diff
changeset
|
2783 # 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:
40052
diff
changeset
|
2784 # 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:
40052
diff
changeset
|
2785 # verification state. |
51093
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
2786 if ( |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
2787 self._inner._revisioncache |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
2788 and self._inner._revisioncache[0] == node |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
2789 ): |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
2790 self._inner._revisioncache = None |
40054
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40052
diff
changeset
|
2791 |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2792 revornode = rev |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2793 if revornode is None: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2794 revornode = templatefilters.short(hex(node)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2795 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2796 _(b"integrity check failed on %s:%s") |
47160
0a66eef0ed97
revlog: use revlog.display_id in integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2797 % (self.display_id, pycompat.bytestr(revornode)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2798 ) |
39773
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39769
diff
changeset
|
2799 except error.RevlogError: |
51047
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
2800 if self.feature_config.censorable and storageutil.iscensoredtext( |
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
2801 text |
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
2802 ): |
47161
f574734eb2b7
revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47160
diff
changeset
|
2803 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
|
2804 raise |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2805 |
50658
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
|
2806 @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
|
2807 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
|
2808 """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
|
2809 |
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
|
2810 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
|
2811 it is always expected at the same location.""" |
50811
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50683
diff
changeset
|
2812 parts = self.radix.split(b'/') |
50659
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50658
diff
changeset
|
2813 if len(parts) > 1: |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50658
diff
changeset
|
2814 # 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:
50658
diff
changeset
|
2815 head = parts[0] + b'-s' |
50811
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50683
diff
changeset
|
2816 mids = parts[1:-1] |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50683
diff
changeset
|
2817 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:
50683
diff
changeset
|
2818 pieces = [head] + mids + [tail] |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50683
diff
changeset
|
2819 return b'/'.join(pieces) |
50659
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50658
diff
changeset
|
2820 else: |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50658
diff
changeset
|
2821 # 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:
50658
diff
changeset
|
2822 # manifest), no risk of collision. |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50658
diff
changeset
|
2823 return self.radix + b'.i.s' |
50658
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
|
2824 |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2825 def _enforceinlinesize(self, tr, side_write=True): |
26376
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2826 """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
|
2827 |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2828 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
|
2829 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
|
2830 to use multiple index and data files. |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2831 """ |
38844
119d14f41cb2
revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents:
38841
diff
changeset
|
2832 tiprev = len(self) - 1 |
47167
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47166
diff
changeset
|
2833 total_size = self.start(tiprev) + self.length(tiprev) |
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47166
diff
changeset
|
2834 if not self._inline or total_size < _maxinline: |
2073 | 2835 return |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2836 |
51085
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51084
diff
changeset
|
2837 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:
51084
diff
changeset
|
2838 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:
51084
diff
changeset
|
2839 raise error.ProgrammingError(msg) |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51084
diff
changeset
|
2840 |
51178
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2841 # In the common case, we enforce inline size because the revlog has |
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2842 # been appened too. And in such case, it must have an initial offset |
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2843 # recorded in the transaction. |
51102
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2844 troffset = tr.findoffset(self._inner.canonical_index_file) |
51178
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2845 pre_touched = troffset is not None |
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2846 if not pre_touched and self.target[0] != KIND_CHANGELOG: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2847 raise error.RevlogError( |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
2848 _(b"%s not found in the transaction") % self._indexfile |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2849 ) |
51178
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2850 |
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51163
diff
changeset
|
2851 tr.addbackup(self._inner.canonical_index_file, for_offset=pre_touched) |
47149
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
2852 tr.add(self._datafile, 0) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2853 |
51087
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2854 new_index_file_path = None |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2855 if side_write: |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2856 old_index_file_path = self._indexfile |
50658
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
|
2857 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:
49828
diff
changeset
|
2858 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
|
2859 weak_self = weakref.ref(self) |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2860 |
51087
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2861 # 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:
51086
diff
changeset
|
2862 # finalized |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2863 def finalize_callback(tr): |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2864 opener.rename( |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2865 new_index_file_path, |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2866 old_index_file_path, |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2867 checkambig=True, |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2868 ) |
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
|
2869 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
|
2870 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
|
2871 maybe_self._indexfile = old_index_file_path |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2872 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
|
2873 |
f952be90b051
revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50316
diff
changeset
|
2874 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
|
2875 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
|
2876 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
|
2877 maybe_self._indexfile = old_index_file_path |
51087
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2878 maybe_self._inner.inline = True |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2879 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:
49828
diff
changeset
|
2880 |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2881 tr.registertmp(new_index_file_path) |
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49828
diff
changeset
|
2882 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
|
2883 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:
49828
diff
changeset
|
2884 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
|
2885 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
|
2886 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
|
2887 tr.addabort(callback_id, abort_callback) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2888 |
51087
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2889 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:
51086
diff
changeset
|
2890 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:
51086
diff
changeset
|
2891 tr, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2892 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:
51086
diff
changeset
|
2893 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:
51086
diff
changeset
|
2894 ) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2895 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2896 self._inline = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2897 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:
51086
diff
changeset
|
2898 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:
51086
diff
changeset
|
2899 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
2900 nodemaputil.setup_persistent_nodemap(tr, self) |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2901 |
39886
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39881
diff
changeset
|
2902 def _nodeduplicatecallback(self, transaction, node): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45870
diff
changeset
|
2903 """called when trying to add a node already stored.""" |
39886
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39881
diff
changeset
|
2904 |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2905 @contextlib.contextmanager |
47463
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47457
diff
changeset
|
2906 def reading(self): |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2907 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:
51082
diff
changeset
|
2908 yield |
47463
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47457
diff
changeset
|
2909 |
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47457
diff
changeset
|
2910 @contextlib.contextmanager |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2911 def _writing(self, transaction): |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
2912 if self._trypending: |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
2913 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:
47239
diff
changeset
|
2914 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:
47239
diff
changeset
|
2915 raise error.ProgrammingError(msg) |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2916 if self._inner.is_writing: |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2917 yield |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2918 else: |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2919 data_end = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2920 sidedata_end = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2921 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:
51082
diff
changeset
|
2922 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:
51082
diff
changeset
|
2923 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:
51082
diff
changeset
|
2924 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:
51082
diff
changeset
|
2925 transaction, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
2926 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:
51082
diff
changeset
|
2927 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:
51082
diff
changeset
|
2928 ): |
47327
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47324
diff
changeset
|
2929 yield |
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47324
diff
changeset
|
2930 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:
47324
diff
changeset
|
2931 self._write_docket(transaction) |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2932 |
51103
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
2933 @property |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
2934 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:
51102
diff
changeset
|
2935 return self._inner.is_delaying |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
2936 |
47239
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47238
diff
changeset
|
2937 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:
47238
diff
changeset
|
2938 """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:
47238
diff
changeset
|
2939 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47238
diff
changeset
|
2940 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:
47238
diff
changeset
|
2941 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47238
diff
changeset
|
2942 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:
47238
diff
changeset
|
2943 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:
47238
diff
changeset
|
2944 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:
47238
diff
changeset
|
2945 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2946 def addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2947 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2948 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2949 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2950 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2951 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2952 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2953 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2954 node=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2955 flags=REVIDX_DEFAULT_FLAGS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2956 deltacomputer=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2957 sidedata=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2958 ): |
1083 | 2959 """add a revision to the log |
2960 | |
2961 text - the revision data to add | |
2962 transaction - the transaction object used for rollback | |
2963 link - the linkrev data to add | |
2964 p1, p2 - the parent nodeids of the revision | |
12012
bade7a9c5c07
revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12011
diff
changeset
|
2965 cachedelta - an optional precomputed delta |
19625
6a411a06cb1f
revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents:
19624
diff
changeset
|
2966 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
|
2967 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
|
2968 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
|
2969 flags - the known flags to set on the revision |
39330
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39329
diff
changeset
|
2970 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
|
2971 multiple calls |
1083 | 2972 """ |
19326
7014526d67a8
revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents:
19200
diff
changeset
|
2973 if link == nullrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2974 raise error.RevlogError( |
47163
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2975 _(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
|
2976 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
2977 |
42986
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42985
diff
changeset
|
2978 if sidedata is None: |
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42985
diff
changeset
|
2979 sidedata = {} |
51058
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51057
diff
changeset
|
2980 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:
43025
diff
changeset
|
2981 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2982 _(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
|
2983 ) |
42986
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42985
diff
changeset
|
2984 |
30745 | 2985 if flags: |
2986 node = node or self.hash(text, p1, p2) | |
2987 | |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
2988 rawtext, validatehash = flagutil.processflagswrite(self, text, flags) |
30745 | 2989 |
2990 # If the flag processor modifies the revision data, ignore any provided | |
2991 # cachedelta. | |
31750
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31749
diff
changeset
|
2992 if rawtext != text: |
30745 | 2993 cachedelta = None |
2994 | |
31750
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31749
diff
changeset
|
2995 if len(rawtext) > _maxentrysize: |
39773
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39769
diff
changeset
|
2996 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2997 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2998 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
|
2999 ) |
47162
dfe8074239de
revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47161
diff
changeset
|
3000 % (self.display_id, len(rawtext)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3001 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
3002 |
31750
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31749
diff
changeset
|
3003 node = node or self.hash(rawtext, p1, p2) |
46508
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46507
diff
changeset
|
3004 rev = self.index.get_rev(node) |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46507
diff
changeset
|
3005 if rev is not None: |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46507
diff
changeset
|
3006 return rev |
12023
44c22dc193a4
revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12012
diff
changeset
|
3007 |
30745 | 3008 if validatehash: |
31750
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31749
diff
changeset
|
3009 self.checkhash(rawtext, node, p1=p1, p2=p2) |
30745 | 3010 |
46508
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46507
diff
changeset
|
3011 return self.addrawrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3012 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3013 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3014 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3015 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3016 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3017 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3018 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3019 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3020 deltacomputer=deltacomputer, |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3021 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3022 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3023 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3024 def addrawrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3025 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3026 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3027 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3028 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3029 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3030 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3031 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3032 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3033 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3034 deltacomputer=None, |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3035 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3036 ): |
32244
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32229
diff
changeset
|
3037 """add a raw revision with known flags, node and parents |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32229
diff
changeset
|
3038 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:
32229
diff
changeset
|
3039 over wire, or read from an external bundle). |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32229
diff
changeset
|
3040 """ |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
3041 with self._writing(transaction): |
46507
9ee4e988e2be
revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46506
diff
changeset
|
3042 return self._addrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3043 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3044 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3045 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3046 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3047 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3048 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3049 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3050 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3051 deltacomputer=deltacomputer, |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3052 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3053 ) |
3390
a74addddd092
make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3360
diff
changeset
|
3054 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
3055 def compress(self, data): |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
3056 return self._inner.compress(data) |
17128
1028a1c9077a
revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents:
17009
diff
changeset
|
3057 |
30793
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
3058 def decompress(self, data): |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
3059 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
|
3060 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3061 def _addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3062 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3063 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3064 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3065 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3066 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3067 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3068 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3069 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3070 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3071 alwayscache=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3072 deltacomputer=None, |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3073 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3074 ): |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3075 """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
|
3076 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3077 see addrevision for argument descriptions. |
31755
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3078 |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3079 note: "addrevision" takes non-raw text, "_addrevision" takes raw text. |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3080 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3081 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
|
3082 be used. |
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3083 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3084 invariants: |
31755
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3085 - 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
|
3086 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
|
3087 """ |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3088 if node == self.nullid: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3089 raise error.RevlogError( |
47163
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3090 _(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
|
3091 ) |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3092 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3093 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3094 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3095 ): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3096 raise error.RevlogError( |
47163
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3097 _(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
|
3098 ) |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
3099 if self._inner._writinghandles is None: |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
3100 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:
47213
diff
changeset
|
3101 raise error.ProgrammingError(msg) |
34028
bfb38c5cebf4
revlog: move check for wdir from changelog to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
34026
diff
changeset
|
3102 |
31755
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3103 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
|
3104 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3105 curr = len(self) |
4981
e7131935fbb3
revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents:
4980
diff
changeset
|
3106 prev = curr - 1 |
46710
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
3107 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
3108 offset = self._get_data_offset(prev) |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3109 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3110 if self._concurrencychecker: |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
3111 ifh, dfh, sdfh = self._inner._writinghandles |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3112 # XXX no checking for the sidedata file |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3113 if self._inline: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3114 # 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:
46509
diff
changeset
|
3115 # the size of the entry metadata. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3116 self._concurrencychecker( |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
3117 ifh, self._indexfile, offset + curr * self.index.entry_size |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3118 ) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3119 else: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3120 # 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:
46509
diff
changeset
|
3121 self._concurrencychecker( |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
3122 ifh, self._indexfile, curr * self.index.entry_size |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3123 ) |
47149
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
3124 self._concurrencychecker(dfh, self._datafile, offset) |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
3125 |
12889
5482c6b826f4
revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents:
12888
diff
changeset
|
3126 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
|
3127 |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3128 # 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
|
3129 # become comparable to the uncompressed text |
31755
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3130 if rawtext is None: |
36748
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
36744
diff
changeset
|
3131 # 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:
36744
diff
changeset
|
3132 # 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:
36744
diff
changeset
|
3133 # logic that might remove metadata size. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3134 textlen = mdiff.patchedsize( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3135 revlog.size(self, cachedelta[0]), cachedelta[1] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3136 ) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3137 else: |
31755
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3138 textlen = len(rawtext) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3139 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3140 if deltacomputer is None: |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3141 write_debug = None |
51051
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51048
diff
changeset
|
3142 if self.delta_config.debug_delta: |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3143 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:
49012
diff
changeset
|
3144 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3145 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:
49012
diff
changeset
|
3146 ) |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3147 |
49677
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49663
diff
changeset
|
3148 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:
49663
diff
changeset
|
3149 # 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:
49663
diff
changeset
|
3150 # 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:
49663
diff
changeset
|
3151 # revlog's configuration. |
51043
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3152 if ( |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3153 self.delta_config.general_delta |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3154 and self.delta_config.lazy_delta_base |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3155 ): |
49677
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49663
diff
changeset
|
3156 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:
49663
diff
changeset
|
3157 else: |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49663
diff
changeset
|
3158 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:
49663
diff
changeset
|
3159 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:
49663
diff
changeset
|
3160 |
47399
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3161 revinfo = revlogutils.revisioninfo( |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3162 node, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3163 p1, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3164 p2, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3165 btext, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3166 textlen, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3167 cachedelta, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3168 flags, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47396
diff
changeset
|
3169 ) |
36744
33275ab5e837
revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents:
36743
diff
changeset
|
3170 |
51017
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51015
diff
changeset
|
3171 deltainfo = deltacomputer.finddeltainfo(revinfo) |
35634
b43578ec483a
revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents:
35521
diff
changeset
|
3172 |
47253
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3173 compression_mode = COMP_MODE_INLINE |
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3174 if self._docket is not None: |
47452
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47450
diff
changeset
|
3175 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:
47450
diff
changeset
|
3176 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:
47450
diff
changeset
|
3177 compression_mode, deltainfo = r |
47253
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3178 |
47256
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
3179 sidedata_compression_mode = COMP_MODE_INLINE |
51058
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51057
diff
changeset
|
3180 if sidedata and self.feature_config.has_side_data: |
47256
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
3181 sidedata_compression_mode = COMP_MODE_PLAIN |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3182 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata) |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3183 sidedata_offset = self._docket.sidedata_end |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
3184 h, comp_sidedata = self._inner.compress(serialized_sidedata) |
47258
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3185 if ( |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3186 h != b'u' |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3187 and comp_sidedata[0:1] != b'\0' |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3188 and len(comp_sidedata) < len(serialized_sidedata) |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3189 ): |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3190 assert not h |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3191 if ( |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3192 comp_sidedata[0:1] |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3193 == self._docket.default_compression_header |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3194 ): |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3195 sidedata_compression_mode = COMP_MODE_DEFAULT |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3196 serialized_sidedata = comp_sidedata |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3197 else: |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3198 sidedata_compression_mode = COMP_MODE_INLINE |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
3199 serialized_sidedata = comp_sidedata |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3200 else: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3201 serialized_sidedata = b"" |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3202 # 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:
46704
diff
changeset
|
3203 # 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:
46704
diff
changeset
|
3204 # than ones we manually add. |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3205 sidedata_offset = 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3206 |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
3207 rank = RANK_UNKNOWN |
51061
81f3877372c3
revlog: remove legacy usage of `_compute_rank`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51058
diff
changeset
|
3208 if self.feature_config.compute_rank: |
48765
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3209 if (p1r, p2r) == (nullrev, nullrev): |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3210 rank = 1 |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3211 elif p1r != nullrev and p2r == nullrev: |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3212 rank = 1 + self.fast_rank(p1r) |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3213 elif p1r == nullrev and p2r != nullrev: |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3214 rank = 1 + self.fast_rank(p2r) |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48761
diff
changeset
|
3215 else: # merge node |
48855
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48851
diff
changeset
|
3216 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:
48851
diff
changeset
|
3217 rank = rustdagop.rank(self.index, p1r, p2r) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48851
diff
changeset
|
3218 else: |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48851
diff
changeset
|
3219 pmin, pmax = sorted((p1r, p2r)) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48851
diff
changeset
|
3220 rank = 1 + self.fast_rank(pmax) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48851
diff
changeset
|
3221 rank += sum(1 for _ in self.findmissingrevs([pmax], [pmin])) |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
3222 |
47396
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3223 e = revlogutils.entry( |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3224 flags=flags, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3225 data_offset=offset, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3226 data_compressed_length=deltainfo.deltalen, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3227 data_uncompressed_length=textlen, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3228 data_compression_mode=compression_mode, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3229 data_delta_base=deltainfo.base, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3230 link_rev=link, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3231 parent_rev_1=p1r, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3232 parent_rev_2=p2r, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3233 node_id=node, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3234 sidedata_offset=sidedata_offset, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
3235 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:
47394
diff
changeset
|
3236 sidedata_compression_mode=sidedata_compression_mode, |
48761
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
3237 rank=rank, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3238 ) |
46704
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46607
diff
changeset
|
3239 |
38850
6104b203bec8
index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38849
diff
changeset
|
3240 self.index.append(e) |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47036
diff
changeset
|
3241 entry = self.index.entry_binary(curr) |
47235
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
3242 if curr == 0 and self._docket is None: |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47136
diff
changeset
|
3243 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:
47136
diff
changeset
|
3244 header = self.index.pack_header(header) |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47036
diff
changeset
|
3245 entry = header + entry |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3246 self._writeentry( |
46709
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3247 transaction, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3248 entry, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3249 deltainfo.data, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3250 link, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3251 offset, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46704
diff
changeset
|
3252 serialized_sidedata, |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3253 sidedata_offset, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3254 ) |
39333
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39332
diff
changeset
|
3255 |
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39332
diff
changeset
|
3256 rawtext = btext[0] |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
3257 |
31755
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3258 if alwayscache and rawtext is None: |
51017
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51015
diff
changeset
|
3259 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
|
3260 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3261 if type(rawtext) == bytes: # only accept immutable objects |
51093
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51092
diff
changeset
|
3262 self._inner._revisioncache = (node, curr, rawtext) |
39333
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39332
diff
changeset
|
3263 self._chainbasecache[curr] = deltainfo.chainbase |
46506
07984507d553
revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46469
diff
changeset
|
3264 return curr |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
3265 |
46710
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
3266 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:
46709
diff
changeset
|
3267 """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:
46709
diff
changeset
|
3268 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:
46709
diff
changeset
|
3269 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:
46709
diff
changeset
|
3270 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:
46709
diff
changeset
|
3271 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:
46709
diff
changeset
|
3272 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:
46709
diff
changeset
|
3273 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
3274 TODO cache this in a docket file before getting out of experimental.""" |
47242
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3275 if self._docket is None: |
46710
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
3276 return self.end(prev) |
47242
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3277 else: |
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3278 return self._docket.data_end |
46710
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46709
diff
changeset
|
3279 |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3280 def _writeentry( |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3281 self, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3282 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3283 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3284 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3285 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3286 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3287 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3288 sidedata_offset, |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3289 ): |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3290 # 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
|
3291 # 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
|
3292 # 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
|
3293 # 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
|
3294 # 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
|
3295 # 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
|
3296 # 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
|
3297 # |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3298 # We work around this issue by inserting a seek() before writing. |
40627
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40626
diff
changeset
|
3299 # 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:
40626
diff
changeset
|
3300 # 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:
40626
diff
changeset
|
3301 # to be careful before changing this. |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3302 index_end = data_end = sidedata_end = None |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
3303 if self._docket is not None: |
51096
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3304 index_end = self._docket.index_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3305 data_end = self._docket.data_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3306 sidedata_end = self._docket.sidedata_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3307 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3308 files_end = self._inner.write_entry( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3309 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3310 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3311 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3312 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3313 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3314 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3315 sidedata_offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3316 index_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3317 data_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3318 sidedata_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3319 ) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3320 self._enforceinlinesize(transaction) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3321 if self._docket is not None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3322 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:
51095
diff
changeset
|
3323 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:
51095
diff
changeset
|
3324 self._docket.sidedata_end = files_end[2] |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
3325 |
44308
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
3326 nodemaputil.setup_persistent_nodemap(transaction, self) |
2073 | 3327 |
45788
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3328 def addgroup( |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3329 self, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3330 deltas, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3331 linkmapper, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3332 transaction, |
46373
711ba0f1057e
revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents:
46310
diff
changeset
|
3333 alwayscache=False, |
45788
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3334 addrevisioncb=None, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3335 duplicaterevisioncb=None, |
49610
35d4c2124073
debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49609
diff
changeset
|
3336 debug_info=None, |
49766
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49677
diff
changeset
|
3337 delta_base_reuse_policy=None, |
45788
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3338 ): |
1083 | 3339 """ |
3340 add a delta group | |
46 | 3341 |
1083 | 3342 given a set of deltas, add them to the revision log. the |
3343 first delta is against its parent, which should be in our | |
3344 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
|
3345 |
00e3f909907f
revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
3346 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
|
3347 this revlog and the node that was added. |
1083 | 3348 """ |
3349 | |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
3350 if self._adding_group: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3351 raise error.ProgrammingError(b'cannot nest addgroup() calls') |
40627
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40626
diff
changeset
|
3352 |
49766
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49677
diff
changeset
|
3353 # 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:
49677
diff
changeset
|
3354 # group did not specify one. |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49677
diff
changeset
|
3355 if delta_base_reuse_policy is None: |
51043
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3356 if ( |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3357 self.delta_config.general_delta |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3358 and self.delta_config.lazy_delta_base |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3359 ): |
49766
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49677
diff
changeset
|
3360 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:
49677
diff
changeset
|
3361 else: |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49677
diff
changeset
|
3362 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:
49677
diff
changeset
|
3363 |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
3364 self._adding_group = True |
45788
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3365 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
|
3366 try: |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
3367 with self._writing(transaction): |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3368 write_debug = None |
51051
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51048
diff
changeset
|
3369 if self.delta_config.debug_delta: |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3370 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:
49012
diff
changeset
|
3371 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3372 self, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3373 write_debug=write_debug, |
49610
35d4c2124073
debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49609
diff
changeset
|
3374 debug_info=debug_info, |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3375 ) |
47212
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3376 # loop through our set of deltas |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3377 for data in deltas: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3378 ( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3379 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3380 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3381 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3382 linknode, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3383 deltabase, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3384 delta, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3385 flags, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3386 sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3387 ) = data |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3388 link = linkmapper(linknode) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3389 flags = flags or REVIDX_DEFAULT_FLAGS |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3390 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3391 rev = self.index.get_rev(node) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3392 if rev is not None: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3393 # 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:
47176
diff
changeset
|
3394 self._nodeduplicatecallback(transaction, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3395 if duplicaterevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3396 duplicaterevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3397 empty = False |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3398 continue |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3399 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3400 for p in (p1, p2): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3401 if not self.index.has_node(p): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3402 raise error.LookupError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3403 p, self.radix, _(b'unknown parent') |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3404 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3405 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3406 if not self.index.has_node(deltabase): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3407 raise error.LookupError( |
47212
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3408 deltabase, self.display_id, _(b'unknown delta base') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3409 ) |
24120
a450e0a2ba0a
revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents:
24118
diff
changeset
|
3410 |
47212
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3411 baserev = self.rev(deltabase) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3412 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3413 if baserev != nullrev and self.iscensored(baserev): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3414 # 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:
47176
diff
changeset
|
3415 # single patch operation |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3416 hlen = struct.calcsize(b">lll") |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3417 oldlen = self.rawsize(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3418 newlen = len(delta) - hlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3419 if delta[:hlen] != mdiff.replacediffheader( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3420 oldlen, newlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3421 ): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3422 raise error.CensoredBaseError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3423 self.display_id, self.node(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3424 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3425 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3426 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:
47176
diff
changeset
|
3427 flags |= REVIDX_ISCENSORED |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3428 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3429 # 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:
47176
diff
changeset
|
3430 # 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:
47176
diff
changeset
|
3431 # 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:
47176
diff
changeset
|
3432 # 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:
47176
diff
changeset
|
3433 # 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:
47176
diff
changeset
|
3434 # 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:
47176
diff
changeset
|
3435 # by the flagprocessor. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3436 rev = self._addrevision( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3437 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3438 None, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3439 transaction, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3440 link, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3441 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3442 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3443 flags, |
49766
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49677
diff
changeset
|
3444 (baserev, delta, delta_base_reuse_policy), |
47212
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3445 alwayscache=alwayscache, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3446 deltacomputer=deltacomputer, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3447 sidedata=sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3448 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3449 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3450 if addrevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3451 addrevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3452 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
|
3453 finally: |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47213
diff
changeset
|
3454 self._adding_group = False |
45788
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45779
diff
changeset
|
3455 return not empty |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3456 |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3457 def iscensored(self, rev): |
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3458 """Check if a file revision is censored.""" |
51047
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
3459 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
|
3460 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3461 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3462 return self.flags(rev) & REVIDX_ISCENSORED |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3463 |
47166
c9ae2e7fe154
revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
3464 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
|
3465 """Quickly check if a delta produces a censored revision.""" |
51047
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
3466 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
|
3467 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3468 |
40325
b0fbd1792e2d
storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40298
diff
changeset
|
3469 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
|
3470 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3471 def getstrippoint(self, minlink): |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3472 """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
|
3473 |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3474 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
|
3475 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
|
3476 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3477 return storageutil.resolvestripinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3478 minlink, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3479 len(self) - 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3480 self.headrevs(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3481 self.linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3482 self.parentrevs, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3483 ) |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3484 |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8017
diff
changeset
|
3485 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
|
3486 """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
|
3487 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3488 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
|
3489 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
|
3490 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3491 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
|
3492 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
|
3493 strip. |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3494 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3495 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
|
3496 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
|
3497 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
|
3498 """ |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3499 if len(self) == 0: |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3500 return |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3501 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3502 rev, _ = self.getstrippoint(minlink) |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3503 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
|
3504 return |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3505 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3506 # first truncate the files on disk |
47242
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3507 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
|
3508 if not self._inline: |
47242
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3509 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
|
3510 end = rev * self.index.entry_size |
2073 | 3511 else: |
47242
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3512 end = data_end + (rev * self.index.entry_size) |
2072 | 3513 |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3514 if self._sidedatafile: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3515 sidedata_end = self.sidedata_cut_off(rev) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3516 transaction.add(self._sidedatafile, sidedata_end) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3517 |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
3518 transaction.add(self._indexfile, end) |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
3519 if self._docket is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
3520 # 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:
47235
diff
changeset
|
3521 # 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:
47235
diff
changeset
|
3522 self._docket.index_end = end |
47242
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
3523 self._docket.data_end = data_end |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3524 self._docket.sidedata_end = sidedata_end |
47238
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
3525 self._docket.write(transaction, stripping=True) |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3526 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3527 # then reset internal state in memory to forget those revisions |
45779
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
3528 self._chaininfocache = util.lrucachedict(500) |
51098
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
3529 self._inner.clear_cache() |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3530 |
4979
06abdaf78788
revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents:
4978
diff
changeset
|
3531 del self.index[rev:-1] |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3532 |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3533 def checksize(self): |
41872
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41857
diff
changeset
|
3534 """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:
41857
diff
changeset
|
3535 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41857
diff
changeset
|
3536 return a (dd, di) tuple. |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41857
diff
changeset
|
3537 - 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:
41857
diff
changeset
|
3538 - 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:
41857
diff
changeset
|
3539 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41857
diff
changeset
|
3540 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:
41857
diff
changeset
|
3541 """ |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3542 expected = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3543 if len(self): |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3544 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
|
3545 |
1494
249ca10d37f4
Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
3546 try: |
35972
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
35971
diff
changeset
|
3547 with self._datafp() as f: |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42462
diff
changeset
|
3548 f.seek(0, io.SEEK_END) |
35972
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
35971
diff
changeset
|
3549 actual = f.tell() |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3550 dd = actual - expected |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49284
diff
changeset
|
3551 except FileNotFoundError: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3552 dd = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3553 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3554 try: |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
3555 f = self.opener(self._indexfile) |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42462
diff
changeset
|
3556 f.seek(0, io.SEEK_END) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3557 actual = f.tell() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13284
diff
changeset
|
3558 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
|
3559 s = self.index.entry_size |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8658
diff
changeset
|
3560 i = max(0, actual // s) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3561 di = actual - (i * s) |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
3562 if self._inline: |
2073 | 3563 databytes = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3564 for r in self: |
5312
fb070713ff36
revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents:
5007
diff
changeset
|
3565 databytes += max(0, self.length(r)) |
2073 | 3566 dd = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3567 di = actual - len(self) * s - databytes |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49284
diff
changeset
|
3568 except FileNotFoundError: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3569 di = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3570 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3571 return (dd, di) |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3572 |
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3573 def files(self): |
51079
808f1e38cd1d
revlog: small doc to the `files` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51078
diff
changeset
|
3574 """return list of files that compose this revlog""" |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
3575 res = [self._indexfile] |
47450
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3576 if self._docket_file is None: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3577 if not self._inline: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3578 res.append(self._datafile) |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3579 else: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3580 res.append(self._docket_file) |
47455
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47452
diff
changeset
|
3581 res.extend(self._docket.old_index_filepaths(include_empty=False)) |
47450
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3582 if self._docket.data_end: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3583 res.append(self._datafile) |
47455
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47452
diff
changeset
|
3584 res.extend(self._docket.old_data_filepaths(include_empty=False)) |
47450
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3585 if self._docket.sidedata_end: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
3586 res.append(self._sidedatafile) |
47455
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47452
diff
changeset
|
3587 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
|
3588 return res |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3589 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3590 def emitrevisions( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3591 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3592 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3593 nodesorder=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3594 revisiondata=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3595 assumehaveparentrevisions=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3596 deltamode=repository.CG_DELTAMODE_STD, |
46715
45f0d5297698
changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46712
diff
changeset
|
3597 sidedata_helpers=None, |
49609
9cac281eb9c0
debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49534
diff
changeset
|
3598 debug_info=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3599 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3600 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
|
3601 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3602 b'unhandled value for nodesorder: %s' % nodesorder |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3603 ) |
39862
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39845
diff
changeset
|
3604 |
51043
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51041
diff
changeset
|
3605 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
|
3606 nodesorder = b'storage' |
39862
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39845
diff
changeset
|
3607 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3608 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3609 not self._storedeltachains |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3610 and deltamode != repository.CG_DELTAMODE_PREV |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3611 ): |
40427
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3612 deltamode = repository.CG_DELTAMODE_FULL |
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3613 |
40008
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40004
diff
changeset
|
3614 return storageutil.emitrevisions( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3615 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3616 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3617 nodesorder, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3618 revlogrevisiondelta, |
40008
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40004
diff
changeset
|
3619 deltaparentfn=self.deltaparent, |
51001
39fa0b948f5a
revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51000
diff
changeset
|
3620 candeltafn=self._candelta, |
40008
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40004
diff
changeset
|
3621 rawsizefn=self.rawsize, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40004
diff
changeset
|
3622 revdifffn=self.revdiff, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40004
diff
changeset
|
3623 flagsfn=self.flags, |
40427
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3624 deltamode=deltamode, |
40008
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40004
diff
changeset
|
3625 revisiondata=revisiondata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3626 assumehaveparentrevisions=assumehaveparentrevisions, |
46715
45f0d5297698
changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46712
diff
changeset
|
3627 sidedata_helpers=sidedata_helpers, |
49609
9cac281eb9c0
debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49534
diff
changeset
|
3628 debug_info=debug_info, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3629 ) |
39862
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39845
diff
changeset
|
3630 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3631 DELTAREUSEALWAYS = b'always' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3632 DELTAREUSESAMEREVS = b'samerevs' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3633 DELTAREUSENEVER = b'never' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3634 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3635 DELTAREUSEFULLADD = b'fulladd' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3636 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3637 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
|
3638 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3639 def clone( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3640 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3641 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3642 destrevlog, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3643 addrevisioncb=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3644 deltareuse=DELTAREUSESAMEREVS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3645 forcedeltabothparents=None, |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3646 sidedata_helpers=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3647 ): |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3648 """Copy this revlog to another, possibly with format changes. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3649 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3650 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
|
3651 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
|
3652 differences. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3653 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3654 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
|
3655 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
|
3656 following values: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3657 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3658 DELTAREUSEALWAYS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3659 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
|
3660 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
|
3661 fastest mode of operation. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3662 DELTAREUSESAMEREVS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3663 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
|
3664 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
|
3665 and optimization. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3666 DELTAREUSENEVER |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3667 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
|
3668 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
|
3669 algorithm changes). |
42997
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42996
diff
changeset
|
3670 DELTAREUSEFULLADD |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42996
diff
changeset
|
3671 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:
42996
diff
changeset
|
3672 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:
42996
diff
changeset
|
3673 eg: large file detection and handling. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3674 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3675 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
|
3676 significantly affect run time. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3677 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3678 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3679 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
|
3680 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
|
3681 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
|
3682 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
|
3683 revision. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3684 |
40837
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40738
diff
changeset
|
3685 In addition to the delta policy, the ``forcedeltabothparents`` |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40738
diff
changeset
|
3686 argument controls whether to force compute deltas against both parents |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40738
diff
changeset
|
3687 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
|
3688 |
47086
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47085
diff
changeset
|
3689 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:
47085
diff
changeset
|
3690 `sidedata_helpers`. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3691 """ |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3692 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
|
3693 raise ValueError( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3694 _(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
|
3695 ) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3696 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3697 if len(destrevlog): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3698 raise ValueError(_(b'destination revlog is not empty')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3699 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3700 if getattr(self, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3701 raise ValueError(_(b'source revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3702 if getattr(destrevlog, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3703 raise ValueError(_(b'destination revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3704 |
41857
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41819
diff
changeset
|
3705 # 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:
41819
diff
changeset
|
3706 # if possible. |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
3707 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:
51026
diff
changeset
|
3708 destrevlog.delta_config = destrevlog.delta_config.copy() |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3709 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3710 try: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3711 if deltareuse == self.DELTAREUSEALWAYS: |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3712 destrevlog.delta_config.lazy_delta_base = True |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3713 destrevlog.delta_config.lazy_delta = True |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3714 elif deltareuse == self.DELTAREUSESAMEREVS: |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3715 destrevlog.delta_config.lazy_delta_base = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3716 destrevlog.delta_config.lazy_delta = True |
41857
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41819
diff
changeset
|
3717 elif deltareuse == self.DELTAREUSENEVER: |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3718 destrevlog.delta_config.lazy_delta_base = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3719 destrevlog.delta_config.lazy_delta = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3720 |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
3721 delta_both_parents = ( |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
3722 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:
51026
diff
changeset
|
3723 ) |
51026
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3724 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
|
3725 |
51111
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3726 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:
51110
diff
changeset
|
3727 self._clone( |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3728 tr, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3729 destrevlog, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3730 addrevisioncb, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3731 deltareuse, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3732 forcedeltabothparents, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3733 sidedata_helpers, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3734 ) |
42996
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3735 |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3736 finally: |
51027
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51026
diff
changeset
|
3737 destrevlog.delta_config = old_delta_config |
39778
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39775
diff
changeset
|
3738 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3739 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
|
3740 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
|
3741 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
|
3742 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
|
3743 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
|
3744 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
|
3745 forcedeltabothparents, |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3746 sidedata_helpers, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3747 ): |
42996
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3748 """perform the core duty of `revlog.clone` after parameter processing""" |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3749 write_debug = None |
51051
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51048
diff
changeset
|
3750 if self.delta_config.debug_delta: |
49227
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3751 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:
49012
diff
changeset
|
3752 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3753 destrevlog, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49012
diff
changeset
|
3754 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:
49012
diff
changeset
|
3755 ) |
42996
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3756 index = self.index |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3757 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:
42995
diff
changeset
|
3758 entry = index[rev] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3759 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3760 # 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:
42995
diff
changeset
|
3761 # account. Use raw entry from index. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3762 flags = entry[0] & 0xFFFF |
42996
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3763 linkrev = entry[4] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3764 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:
42995
diff
changeset
|
3765 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:
42995
diff
changeset
|
3766 node = entry[7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3767 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3768 # (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:
42995
diff
changeset
|
3769 # 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:
42995
diff
changeset
|
3770 cachedelta = None |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3771 rawtext = None |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3772 if deltareuse == self.DELTAREUSEFULLADD: |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47384
diff
changeset
|
3773 text = self._revisiondata(rev) |
47384
fec306b05328
revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47382
diff
changeset
|
3774 sidedata = self.sidedata(rev) |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3775 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3776 if sidedata_helpers is not None: |
47085
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47084
diff
changeset
|
3777 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3778 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3779 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3780 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
|
3781 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3782 destrevlog.addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3783 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3784 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3785 linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3786 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3787 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3788 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3789 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3790 flags=flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3791 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
|
3792 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3793 ) |
42996
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3794 else: |
51063
b79c73a7afce
revlog: remove legacy usage of `_lazydelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51062
diff
changeset
|
3795 if destrevlog.delta_config.lazy_delta: |
42998
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3796 dp = self.deltaparent(rev) |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3797 if dp != nullrev: |
51089
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51088
diff
changeset
|
3798 cachedelta = (dp, bytes(self._inner._chunk(rev))) |
42998
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3799 |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3800 sidedata = None |
42998
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3801 if not cachedelta: |
51110
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51074
diff
changeset
|
3802 try: |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51074
diff
changeset
|
3803 rawtext = self._revisiondata(rev) |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51074
diff
changeset
|
3804 except error.CensoredNodeError as censored: |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51074
diff
changeset
|
3805 assert flags & REVIDX_ISCENSORED |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51074
diff
changeset
|
3806 rawtext = censored.tombstone |
47384
fec306b05328
revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47382
diff
changeset
|
3807 sidedata = self.sidedata(rev) |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3808 if sidedata is None: |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3809 sidedata = self.sidedata(rev) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3810 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3811 if sidedata_helpers is not None: |
47085
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47084
diff
changeset
|
3812 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47084
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3813 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3814 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
3815 flags = flags | new_flags[0] & ~new_flags[1] |
42998
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3816 |
51111
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3817 destrevlog._addrevision( |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3818 node, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3819 rawtext, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3820 tr, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3821 linkrev, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3822 p1, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3823 p2, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3824 flags, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3825 cachedelta, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3826 deltacomputer=deltacomputer, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3827 sidedata=sidedata, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
3828 ) |
42996
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3829 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3830 if addrevisioncb: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
3831 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:
42995
diff
changeset
|
3832 |
40056
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40055
diff
changeset
|
3833 def censorrevision(self, tr, censornode, tombstone=b''): |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47136
diff
changeset
|
3834 if self._format_version == REVLOGV0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3835 raise error.RevlogError( |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47136
diff
changeset
|
3836 _(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:
47136
diff
changeset
|
3837 % self._format_version |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3838 ) |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
3839 elif self._format_version == REVLOGV1: |
47465
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47463
diff
changeset
|
3840 rewrite.v1_censor(self, tr, censornode, tombstone) |
47391
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47389
diff
changeset
|
3841 else: |
47465
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47463
diff
changeset
|
3842 rewrite.v2_censor(self, tr, censornode, tombstone) |
39778
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39775
diff
changeset
|
3843 |
39842
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3844 def verifyintegrity(self, state): |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3845 """Verifies the integrity of the revlog. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3846 |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3847 Yields ``revlogproblem`` instances describing problems that are |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3848 found. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3849 """ |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3850 dd, di = self.checksize() |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3851 if dd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3852 yield revlogproblem(error=_(b'data length off by %d bytes') % dd) |
39842
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3853 if di: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3854 yield revlogproblem(error=_(b'index contains %d extra bytes') % di) |
39842
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39831
diff
changeset
|
3855 |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47136
diff
changeset
|
3856 version = self._format_version |
39845
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39842
diff
changeset
|
3857 |
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39842
diff
changeset
|
3858 # 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
|
3859 if version != state[b'expectedversion']: |
39845
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39842
diff
changeset
|
3860 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3861 warning=_(b"warning: '%s' uses revlog format %d; expected %d") |
47157
3a9f3470922c
revlog: use revlog.display_id in format related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47155
diff
changeset
|
3862 % (self.display_id, version, state[b'expectedversion']) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3863 ) |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3864 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3865 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
|
3866 state[b'safe_renamed'] = set() |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3867 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3868 for rev in self: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3869 node = self.node(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3870 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3871 # Verify contents. 4 cases to care about: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3872 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3873 # common: the most common case |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3874 # rename: with a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3875 # 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:
39869
diff
changeset
|
3876 # header defined in filelog.py, but without a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3877 # ext: content stored externally |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3878 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3879 # More formally, their differences are shown below: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3880 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3881 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3882 # ------------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3883 # flags() | 0 | 0 | 0 | not 0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3884 # renamed() | False | True | False | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3885 # rawtext[0:2]=='\1\n'| False | True | True | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3886 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3887 # "rawtext" means the raw text stored in revlog data, which |
42768
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42732
diff
changeset
|
3888 # could be retrieved by "rawdata(rev)". "text" |
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42732
diff
changeset
|
3889 # mentioned below is "revision(rev)". |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3890 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3891 # There are 3 different lengths stored physically: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3892 # 1. L1: rawsize, stored in revlog index |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3893 # 2. L2: len(rawtext), stored in revlog data |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3894 # 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:
39869
diff
changeset
|
3895 # possibly somewhere else if flags!=0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3896 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3897 # 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:
39869
diff
changeset
|
3898 # "text" may or may not affect commit hash depending on flag |
42732
6d61be152c55
flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42731
diff
changeset
|
3899 # processors (see flagutil.addflagprocessor). |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3900 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3901 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3902 # ------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3903 # rawsize() | L1 | L1 | L1 | L1 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3904 # size() | L1 | L2-LM | L1(*) | L1 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3905 # len(rawtext) | L2 | L2 | L2 | L2 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3906 # len(text) | L2 | L2 | L2 | L3 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3907 # len(read()) | L2 | L2-LM | L2-LM | L3 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3908 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3909 # LM: length of metadata, depending on rawtext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3910 # (*): not ideal, see comment in filelog.size |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3911 # (?): could be "- len(meta)" if the resolved content has |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3912 # rename metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3913 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3914 # Checks needed to be done: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3915 # 1. length check: L1 == L2, in all cases. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3916 # 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:
39869
diff
changeset
|
3917 # use either "text" (external), or "rawtext" (in revlog). |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3918 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3919 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3920 skipflags = state.get(b'skipflags', 0) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3921 if skipflags: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3922 skipflags &= self.flags(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3923 |
43957
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43779
diff
changeset
|
3924 _verify_revision(self, skipflags, state, node) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3925 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3926 l1 = self.rawsize(rev) |
42768
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42732
diff
changeset
|
3927 l2 = len(self.rawdata(node)) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3928 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3929 if l1 != l2: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3930 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3931 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
|
3932 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3933 ) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3934 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3935 except error.CensoredNodeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3936 if state[b'erroroncensored']: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3937 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3938 error=_(b'censored file data'), node=node |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3939 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3940 state[b'skipread'].add(node) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3941 except Exception as e: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3942 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3943 error=_(b'unpacking %s: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3944 % (short(node), stringutil.forcebytestr(e)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3945 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3946 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3947 state[b'skipread'].add(node) |
39872
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39869
diff
changeset
|
3948 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3949 def storageinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3950 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3951 exclusivefiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3952 sharedfiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3953 revisionscount=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3954 trackedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3955 storedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3956 ): |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3957 d = {} |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3958 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3959 if exclusivefiles: |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
3960 d[b'exclusivefiles'] = [(self.opener, self._indexfile)] |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3961 if not self._inline: |
47149
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
3962 d[b'exclusivefiles'].append((self.opener, self._datafile)) |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3963 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3964 if sharedfiles: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3965 d[b'sharedfiles'] = [] |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3966 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3967 if revisionscount: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3968 d[b'revisionscount'] = len(self) |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3969 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3970 if trackedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3971 d[b'trackedsize'] = sum(map(self.rawsize, iter(self))) |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3972 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3973 if storedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3974 d[b'storedsize'] = sum( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3975 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
|
3976 ) |
39869
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3977 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39866
diff
changeset
|
3978 return d |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3979 |
47216
2bd4b5218918
revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47215
diff
changeset
|
3980 def rewrite_sidedata(self, transaction, helpers, startrev, endrev): |
51058
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51057
diff
changeset
|
3981 if not self.feature_config.has_side_data: |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3982 return |
47234
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47231
diff
changeset
|
3983 # revlog formats with sidedata support does not support inline |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3984 assert not self._inline |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3985 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:
46716
diff
changeset
|
3986 # Nothing to generate or remove |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3987 return |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3988 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3989 new_entries = [] |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3990 # append the new sidedata |
47218
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47217
diff
changeset
|
3991 with self._writing(transaction): |
51083
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51082
diff
changeset
|
3992 ifh, dfh, sdfh = self._inner._writinghandles |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3993 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:
47387
diff
changeset
|
3994 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
3995 current_offset = sdfh.tell() |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3996 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:
46716
diff
changeset
|
3997 entry = self.index[rev] |
47085
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47084
diff
changeset
|
3998 new_sidedata, flags = sidedatautil.run_sidedata_helpers( |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
3999 store=self, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4000 sidedata_helpers=helpers, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4001 sidedata={}, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4002 rev=rev, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4003 ) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4004 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4005 serialized_sidedata = sidedatautil.serialize_sidedata( |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4006 new_sidedata |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4007 ) |
47259
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4008 |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4009 sidedata_compression_mode = COMP_MODE_INLINE |
51058
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51057
diff
changeset
|
4010 if serialized_sidedata and self.feature_config.has_side_data: |
47259
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4011 sidedata_compression_mode = COMP_MODE_PLAIN |
51088
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51087
diff
changeset
|
4012 h, comp_sidedata = self._inner.compress(serialized_sidedata) |
47259
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4013 if ( |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4014 h != b'u' |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4015 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:
47258
diff
changeset
|
4016 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:
47258
diff
changeset
|
4017 ): |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4018 assert not h |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4019 if ( |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4020 comp_sidedata[0] |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4021 == self._docket.default_compression_header |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4022 ): |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4023 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:
47258
diff
changeset
|
4024 serialized_sidedata = comp_sidedata |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4025 else: |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4026 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:
47258
diff
changeset
|
4027 serialized_sidedata = comp_sidedata |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4028 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:
46716
diff
changeset
|
4029 # 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:
46716
diff
changeset
|
4030 # 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:
46716
diff
changeset
|
4031 # revlog. |
47228
e51392acd70c
revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47222
diff
changeset
|
4032 msg = b"rewriting existing sidedata is not supported yet" |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4033 raise error.Abort(msg) |
47078
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47077
diff
changeset
|
4034 |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47077
diff
changeset
|
4035 # 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:
47077
diff
changeset
|
4036 # the sidedata helpers |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47077
diff
changeset
|
4037 new_offset_flags = entry[0] | flags[0] & ~flags[1] |
47245
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4038 entry_update = ( |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4039 current_offset, |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4040 len(serialized_sidedata), |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4041 new_offset_flags, |
47259
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47258
diff
changeset
|
4042 sidedata_compression_mode, |
47245
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4043 ) |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4044 |
47217
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47216
diff
changeset
|
4045 # the sidedata computation might have move the file cursors around |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
4046 sdfh.seek(current_offset, os.SEEK_SET) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
4047 sdfh.write(serialized_sidedata) |
47245
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4048 new_entries.append(entry_update) |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4049 current_offset += len(serialized_sidedata) |
47389
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47387
diff
changeset
|
4050 self._docket.sidedata_end = sdfh.tell() |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4051 |
47218
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47217
diff
changeset
|
4052 # rewrite the new index entries |
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47217
diff
changeset
|
4053 ifh.seek(startrev * self.index.entry_size) |
47078
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47077
diff
changeset
|
4054 for i, e in enumerate(new_entries): |
46718
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46716
diff
changeset
|
4055 rev = startrev + i |
47245
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4056 self.index.replace_sidedata_info(rev, *e) |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47036
diff
changeset
|
4057 packed = self.index.entry_binary(rev) |
47235
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
4058 if rev == 0 and self._docket is None: |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47136
diff
changeset
|
4059 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:
47136
diff
changeset
|
4060 header = self.index.pack_header(header) |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47036
diff
changeset
|
4061 packed = header + packed |
47215
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47214
diff
changeset
|
4062 ifh.write(packed) |