Mercurial > hg-stable
annotate mercurial/revlog.py @ 51901:f4733654f144
typing: add `from __future__ import annotations` to most files
Now that py36 is no longer supported, we can postpone annotation evaluation.
This means that the quoting is usually optional (for things imported under the
guard of `if typing.TYPE_CHECKING:` to avoid circular imports), and there's less
overhead on startup[1].
There may be some missing here. I backed out 6000f5b25c9b (which removed the
`from __future__ import ...` that was supporting py2), reverted the changes in
`contrib/`, `doc/`, and `tests/`, and then ran:
$ hg status -n --change . | \
xargs sed -i -e 's/from __future__ import .*$/from __future__ import annotations/'
There were some minor tweaks needed when reviewing (mostly making the spacing
around the import consistent, and `mercurial/testing/__init__.py` had a
multiline import that wasn't fully rewritten.
[1] https://docs.python.org/3/whatsnew/3.7.html#pep-563-postponed-evaluation-of-annotations
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Mon, 16 Sep 2024 15:36:44 +0200 |
parents | 8c39ba94acce |
children | cfd30df0f8e4 |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # revlog.py - storage back-end for mercurial |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
2 # coding: utf8 |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46807
diff
changeset
|
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
8 |
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
9 """Storage back-end for Mercurial. |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
10 |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
11 This provides efficient delta storage with O(1) retrieve and append |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
12 and O(changes) merge between branches. |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
13 """ |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
14 |
51901
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51898
diff
changeset
|
15 from __future__ import annotations |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
16 |
46852
fbfb1d6d8459
revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
46819
diff
changeset
|
17 import binascii |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
18 import collections |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
19 import contextlib |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
20 import functools |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
21 import io |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
22 import os |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
23 import struct |
51788
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
24 import typing |
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
|
25 import weakref |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
26 import zlib |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
27 |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
28 from typing import ( |
51868
0338fb200a30
typing: lock in new pytype gains from making revlog related classes typeable
Matt Harbison <matt_harbison@yahoo.com>
parents:
51867
diff
changeset
|
29 Iterable, |
0338fb200a30
typing: lock in new pytype gains from making revlog related classes typeable
Matt Harbison <matt_harbison@yahoo.com>
parents:
51867
diff
changeset
|
30 Iterator, |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
31 Optional, |
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
32 Tuple, |
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
33 ) |
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
34 |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
35 # 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
|
36 from .node import ( |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
37 bin, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
38 hex, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
39 nullrev, |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
40 sha1nodeconstants, |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
41 short, |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
42 wdirrev, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
43 ) |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
44 from .i18n import _ |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
45 from .revlogutils.constants import ( |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
46 ALL_KINDS, |
47277
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47274
diff
changeset
|
47 CHANGELOGV2, |
47266
ff9fd7107d11
revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47265
diff
changeset
|
48 COMP_MODE_DEFAULT, |
47260
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47257
diff
changeset
|
49 COMP_MODE_INLINE, |
47264
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
50 COMP_MODE_PLAIN, |
49791
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
51 DELTA_BASE_REUSE_NO, |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
52 DELTA_BASE_REUSE_TRY, |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
53 ENTRY_RANK, |
47242
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
54 FEATURES_BY_VERSION, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
55 FLAG_GENERALDELTA, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
56 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
|
57 INDEX_HEADER, |
47274
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
58 KIND_CHANGELOG, |
49712
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
59 KIND_FILELOG, |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
60 RANK_UNKNOWN, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
61 REVLOGV0, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
62 REVLOGV1, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
63 REVLOGV1_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
64 REVLOGV2, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
65 REVLOGV2_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
66 REVLOG_DEFAULT_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
67 REVLOG_DEFAULT_FORMAT, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
68 REVLOG_DEFAULT_VERSION, |
47241
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
69 SUPPORTED_FLAGS, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
70 ) |
42745
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
71 from .revlogutils.flagutil import ( |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
72 REVIDX_DEFAULT_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
73 REVIDX_ELLIPSIS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
74 REVIDX_EXTSTORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
75 REVIDX_FLAGS_ORDER, |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45054
diff
changeset
|
76 REVIDX_HASCOPIESINFO, |
42745
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
77 REVIDX_ISCENSORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
78 REVIDX_RAWTEXT_CHANGING_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
79 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
80 from .thirdparty import attr |
51788
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
81 |
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
82 # Force pytype to use the non-vendored package |
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
83 if typing.TYPE_CHECKING: |
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
84 # noinspection PyPackageRequirements |
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
85 import attr |
278af66e6595
typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
86 |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
87 from . import ( |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
88 ancestor, |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
89 dagop, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
90 error, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
91 mdiff, |
32411
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32355
diff
changeset
|
92 policy, |
31580
a8e55d6f1d67
revlog: use pycompat.maplist to eagerly evaluate map on Python 3
Augie Fackler <augie@google.com>
parents:
31511
diff
changeset
|
93 pycompat, |
47400
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47399
diff
changeset
|
94 revlogutils, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
95 templatefilters, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
96 util, |
51862
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
97 vfs as vfsmod, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
98 ) |
42823
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
99 from .interfaces import ( |
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
100 repository, |
42824
2c4f656c8e9f
interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42823
diff
changeset
|
101 util as interfaceutil, |
42823
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
102 ) |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
103 from .revlogutils import ( |
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
104 deltas as deltautil, |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
105 docket as docketutil, |
42746
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42745
diff
changeset
|
106 flagutil, |
44035
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44017
diff
changeset
|
107 nodemap as nodemaputil, |
47431
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47420
diff
changeset
|
108 randomaccessfile, |
47079
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
109 revlogv0, |
47470
bc8536e09a20
revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47469
diff
changeset
|
110 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
|
111 sidedata as sidedatautil, |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
112 ) |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
113 from .utils import ( |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
114 storageutil, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
115 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
116 ) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
117 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
118 # blanked usage of all the name to prevent pyflakes constraints |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
119 # We need these name available in the module for extensions. |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
120 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
121 REVLOGV0 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
122 REVLOGV1 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
123 REVLOGV2 |
48772
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48768
diff
changeset
|
124 CHANGELOGV2 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
125 FLAG_INLINE_DATA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
126 FLAG_GENERALDELTA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
127 REVLOG_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
128 REVLOG_DEFAULT_FORMAT |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
129 REVLOG_DEFAULT_VERSION |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
130 REVLOGV1_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
131 REVLOGV2_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
132 REVIDX_ISCENSORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
133 REVIDX_ELLIPSIS |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45054
diff
changeset
|
134 REVIDX_HASCOPIESINFO |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
135 REVIDX_EXTSTORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
136 REVIDX_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
137 REVIDX_FLAGS_ORDER |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
138 REVIDX_RAWTEXT_CHANGING_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
139 |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
140 parsers = policy.importmod('parsers') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
141 rustancestor = policy.importrust('ancestor') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
142 rustdagop = policy.importrust('dagop') |
44017
8042856c90b6
rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents:
43984
diff
changeset
|
143 rustrevlog = policy.importrust('revlog') |
32411
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32355
diff
changeset
|
144 |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
145 # Aliased for performance. |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
146 _zlibdecompress = zlib.decompress |
5007
3addf4531643
revlog: localize some fastpath functions
Matt Mackall <mpm@selenic.com>
parents:
5006
diff
changeset
|
147 |
49923
9854a9adc466
revlog: fix misleading comment about _maxinline
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49877
diff
changeset
|
148 # 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
|
149 _maxinline = 131072 |
10913
f2ecc5733c89
revlog: factor out _maxinline global.
Greg Ward <greg-hg@gerg.ca>
parents:
10404
diff
changeset
|
150 |
51394
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
151 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
152 # Flag processors for REVIDX_ELLIPSIS. |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
153 def ellipsisreadprocessor(rl, text): |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
154 return text, False |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
155 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
156 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
157 def ellipsiswriteprocessor(rl, text): |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
158 return text, False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
159 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
160 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
161 def ellipsisrawprocessor(rl, text): |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
162 return False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
163 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
164 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
165 ellipsisprocessor = ( |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
166 ellipsisreadprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
167 ellipsiswriteprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
168 ellipsisrawprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
169 ) |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
170 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
171 |
43962
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
172 def _verify_revision(rl, skipflags, state, node): |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
173 """Verify the integrity of the given revlog ``node`` while providing a hook |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
174 point for extensions to influence the operation.""" |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
175 if skipflags: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
176 state[b'skipread'].add(node) |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
177 else: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
178 # Side-effect: read content and verify hash. |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
179 rl.revision(node) |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
180 |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
181 |
46310
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
182 # True if a fast implementation for persistent-nodemap is available |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
183 # |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
184 # We also consider we have a "fast" implementation in "pure" python because |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
185 # people using pure don't really have performance consideration (and a |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
186 # wheelbarrow of other slowness source) |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
187 HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or hasattr( |
46310
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
188 parsers, 'BaseIndexObject' |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
189 ) |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
190 |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
191 |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
192 @attr.s(slots=True) |
51866
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
193 class RevLogRevisionDelta: |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
194 node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
195 p1node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
196 p2node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
197 basenode = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
198 flags = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
199 baserevisionsize = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
200 revision = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
201 delta = attr.ib() |
46725
e8c11a2c96c0
delta: add sidedata field to revision delta
Raphaël Gomès <rgomes@octobus.net>
parents:
46724
diff
changeset
|
202 sidedata = attr.ib() |
47094
119790e1c67c
cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents:
47092
diff
changeset
|
203 protocol_flags = attr.ib() |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
204 linknode = attr.ib(default=None) |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
205 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
206 |
51866
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
207 revlogrevisiondelta = interfaceutil.implementer(repository.irevisiondelta)( |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
208 RevLogRevisionDelta |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
209 ) |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
210 |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
211 if typing.TYPE_CHECKING: |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
212 revlogrevisiondelta = RevLogRevisionDelta |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
213 |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
214 |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
215 @attr.s(frozen=True) |
51866
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
216 class RevLogProblem: |
51867
766c55492258
typing: add types to `revlog.revlogproblem`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51866
diff
changeset
|
217 warning = attr.ib(default=None, type=Optional[bytes]) |
766c55492258
typing: add types to `revlog.revlogproblem`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51866
diff
changeset
|
218 error = attr.ib(default=None, type=Optional[bytes]) |
766c55492258
typing: add types to `revlog.revlogproblem`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51866
diff
changeset
|
219 node = attr.ib(default=None, type=Optional[bytes]) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
220 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
221 |
51866
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
222 revlogproblem = interfaceutil.implementer(repository.iverifyproblem)( |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
223 RevLogProblem |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
224 ) |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
225 |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
226 if typing.TYPE_CHECKING: |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
227 revlogproblem = RevLogProblem |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
228 |
bcaa5d408657
typing: make the revlog classes known to pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
229 |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
230 def parse_index_v1(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
231 # call the C implementation to parse the index data |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
232 index, cache = parsers.parse_index2(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
233 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
234 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
235 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
236 def parse_index_v2(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
237 # call the C implementation to parse the index data |
48772
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48768
diff
changeset
|
238 index, cache = parsers.parse_index2(data, inline, format=REVLOGV2) |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
239 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
240 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
241 |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
242 def parse_index_cl_v2(data, inline): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
243 # call the C implementation to parse the index data |
48772
1bb62821f080
revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents:
48768
diff
changeset
|
244 index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2) |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
245 return index, cache |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
246 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
247 |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
248 if hasattr(parsers, 'parse_index_devel_nodemap'): |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
249 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
250 def parse_index_v1_nodemap(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
251 index, cache = parsers.parse_index_devel_nodemap(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
252 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
253 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
254 else: |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
255 parse_index_v1_nodemap = None |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
256 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
257 |
51275
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51274
diff
changeset
|
258 def parse_index_v1_rust(data, inline, default_header): |
51274
96e05f1a99bd
rust-index: stop instantiating a C Index
Georges Racinet <georges.racinet@octobus.net>
parents:
51259
diff
changeset
|
259 cache = (0, data) if inline else None |
51275
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51274
diff
changeset
|
260 return rustrevlog.Index(data, default_header), cache |
4972
8d0cf46e0dc6
revlog: add revlogio interface
Matt Mackall <mpm@selenic.com>
parents:
4971
diff
changeset
|
261 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
262 |
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
|
263 # 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
|
264 # signed integer) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
265 _maxentrysize = 0x7FFFFFFF |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
266 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
267 FILE_TOO_SHORT_MSG = _( |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
268 b'cannot read from revlog %s;' |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
269 b' expected %d bytes from offset %d, data size is %d' |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
270 ) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
271 |
49448
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
272 hexdigits = b'0123456789abcdefABCDEF' |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
273 |
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
|
274 |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
275 class _Config: |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
276 def copy(self): |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
277 return self.__class__(**self.__dict__) |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
278 |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
279 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
280 @attr.s() |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
281 class FeatureConfig(_Config): |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
282 """Hold configuration values about the available revlog features""" |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
283 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
284 # the default compression engine |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
285 compression_engine = attr.ib(default=b'zlib') |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
286 # compression engines options |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
287 compression_engine_options = attr.ib(default=attr.Factory(dict)) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
288 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
289 # can we use censor on this revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
290 censorable = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
291 # does this revlog use the "side data" feature |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
292 has_side_data = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
293 # might remove rank configuration once the computation has no impact |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
294 compute_rank = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
295 # parent order is supposed to be semantically irrelevant, so we |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
296 # normally resort parents to ensure that the first parent is non-null, |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
297 # if there is a non-null parent at all. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
298 # filelog abuses the parent order as flag to mark some instances of |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
299 # meta-encoded files, so allow it to disable this behavior. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
300 canonical_parent_order = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
301 # can ellipsis commit be used |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
302 enable_ellipsis = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
303 |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
304 def copy(self): |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
305 new = super().copy() |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
306 new.compression_engine_options = self.compression_engine_options.copy() |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
307 return new |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
308 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
309 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
310 @attr.s() |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
311 class DataConfig(_Config): |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
312 """Hold configuration value about how the revlog data are read""" |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
313 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
314 # should we try to open the "pending" version of the revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
315 try_pending = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
316 # should we try to open the "splitted" version of the revlog |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
317 try_split = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
318 # When True, indexfile should be opened with checkambig=True at writing, |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
319 # to avoid file stat ambiguity. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
320 check_ambig = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
321 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
322 # If true, use mmap instead of reading to deal with large index |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
323 mmap_large_index = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
324 # how much data is large |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
325 mmap_index_threshold = attr.ib(default=None) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
326 # How much data to read and cache into the raw revlog data cache. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
327 chunk_cache_size = attr.ib(default=65536) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
328 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
329 # The size of the uncompressed cache compared to the largest revision seen. |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
330 uncompressed_cache_factor = attr.ib(default=None) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
331 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
332 # The number of chunk cached |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
333 uncompressed_cache_count = attr.ib(default=None) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
334 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
335 # Allow sparse reading of the revlog data |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
336 with_sparse_read = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
337 # minimal density of a sparse read chunk |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
338 sr_density_threshold = attr.ib(default=0.50) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
339 # minimal size of data we skip when performing sparse read |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
340 sr_min_gap_size = attr.ib(default=262144) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
341 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
342 # are delta encoded against arbitrary bases. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
343 generaldelta = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
344 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
345 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
346 @attr.s() |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
347 class DeltaConfig(_Config): |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
348 """Hold configuration value about how new delta are computed |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
349 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
350 Some attributes are duplicated from DataConfig to help havign each object |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
351 self contained. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
352 """ |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
353 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
354 # can delta be encoded against arbitrary bases. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
355 general_delta = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
356 # Allow sparse writing of the revlog data |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
357 sparse_revlog = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
358 # maximum length of a delta chain |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
359 max_chain_len = attr.ib(default=None) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
360 # Maximum distance between delta chain base start and end |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
361 max_deltachain_span = attr.ib(default=-1) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
362 # If `upper_bound_comp` is not None, this is the expected maximal gain from |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
363 # compression for the data content. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
364 upper_bound_comp = attr.ib(default=None) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
365 # Should we try a delta against both parent |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
366 delta_both_parents = attr.ib(default=True) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
367 # Test delta base candidate group by chunk of this maximal size. |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
368 candidate_group_chunk_size = attr.ib(default=0) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
369 # Should we display debug information about delta computation |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
370 debug_delta = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
371 # trust incoming delta by default |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
372 lazy_delta = attr.ib(default=True) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
373 # trust the base of incoming delta by default |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
374 lazy_delta_base = attr.ib(default=False) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
375 |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
376 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
377 class _InnerRevlog: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
378 """An inner layer of the revlog object |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
379 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
380 That layer exist to be able to delegate some operation to Rust, its |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
381 boundaries are arbitrary and based on what we can delegate to Rust. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
382 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
383 |
51862
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
384 opener: vfsmod.vfs |
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
385 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
386 def __init__( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
387 self, |
51862
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
388 opener: vfsmod.vfs, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
389 index, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
390 index_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
391 data_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
392 sidedata_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
393 inline, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
394 data_config, |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
395 delta_config, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
396 feature_config, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
397 chunk_cache, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
398 default_compression_header, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
399 ): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
400 self.opener = opener |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
401 self.index = index |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
402 |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
403 self.index_file = index_file |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
404 self.data_file = data_file |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
405 self.sidedata_file = sidedata_file |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
406 self.inline = inline |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
407 self.data_config = data_config |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
408 self.delta_config = delta_config |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
409 self.feature_config = feature_config |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
410 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
411 # used during diverted write. |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
412 self._orig_index_file = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
413 |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
414 self._default_compression_header = default_compression_header |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
415 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
416 # index |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
417 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
418 # 3-tuple of file handles being used for active writing. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
419 self._writinghandles = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
420 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
421 self._segmentfile = randomaccessfile.randomaccessfile( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
422 self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
423 (self.index_file if self.inline else self.data_file), |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
424 self.data_config.chunk_cache_size, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
425 chunk_cache, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
426 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
427 self._segmentfile_sidedata = randomaccessfile.randomaccessfile( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
428 self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
429 self.sidedata_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
430 self.data_config.chunk_cache_size, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
431 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
432 |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
433 # revlog header -> revlog compressor |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
434 self._decompressors = {} |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
435 # 3-tuple of (node, rev, text) for a raw revision. |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
436 self._revisioncache = None |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
437 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
438 # cache some uncompressed chunks |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
439 # rev → uncompressed_chunk |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
440 # |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
441 # the max cost is dynamically updated to be proportionnal to the |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
442 # size of revision we actually encounter. |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
443 self._uncompressed_chunk_cache = None |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
444 if self.data_config.uncompressed_cache_factor is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
445 self._uncompressed_chunk_cache = util.lrucachedict( |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
446 self.data_config.uncompressed_cache_count, |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
447 maxcost=65536, # some arbitrary initial value |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
448 ) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
449 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
450 self._delay_buffer = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
451 |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
452 def __len__(self): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
453 return len(self.index) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
454 |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
455 def clear_cache(self): |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
456 assert not self.is_delaying |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
457 self._revisioncache = None |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
458 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
459 self._uncompressed_chunk_cache.clear() |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
460 self._segmentfile.clear_cache() |
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
461 self._segmentfile_sidedata.clear_cache() |
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
462 |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
463 @property |
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
464 def canonical_index_file(self): |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
465 if self._orig_index_file is not None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
466 return self._orig_index_file |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
467 return self.index_file |
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
468 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
469 @property |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
470 def is_delaying(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
471 """is the revlog is currently delaying the visibility of written data? |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
472 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
473 The delaying mechanism can be either in-memory or written on disk in a |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
474 side-file.""" |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
475 return (self._delay_buffer is not None) or ( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
476 self._orig_index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
477 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
478 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
479 # Derived from index values. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
480 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
481 def start(self, rev): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
482 """the offset of the data chunk for this revision""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
483 return int(self.index[rev][0] >> 16) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
484 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
485 def length(self, rev): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
486 """the length of the data chunk for this revision""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
487 return self.index[rev][1] |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
488 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
489 def end(self, rev): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
490 """the end of the data chunk for this revision""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
491 return self.start(rev) + self.length(rev) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
492 |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
493 def deltaparent(self, rev): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
494 """return deltaparent of the given revision""" |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
495 base = self.index[rev][3] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
496 if base == rev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
497 return nullrev |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
498 elif self.delta_config.general_delta: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
499 return base |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
500 else: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
501 return rev - 1 |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
502 |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
503 def issnapshot(self, rev): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
504 """tells whether rev is a snapshot""" |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
505 if not self.delta_config.sparse_revlog: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
506 return self.deltaparent(rev) == nullrev |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
507 elif hasattr(self.index, 'issnapshot'): |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
508 # directly assign the method to cache the testing and access |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
509 self.issnapshot = self.index.issnapshot |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
510 return self.issnapshot(rev) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
511 if rev == nullrev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
512 return True |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
513 entry = self.index[rev] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
514 base = entry[3] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
515 if base == rev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
516 return True |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
517 if base == nullrev: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
518 return True |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
519 p1 = entry[5] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
520 while self.length(p1) == 0: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
521 b = self.deltaparent(p1) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
522 if b == p1: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
523 break |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
524 p1 = b |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
525 p2 = entry[6] |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
526 while self.length(p2) == 0: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
527 b = self.deltaparent(p2) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
528 if b == p2: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
529 break |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
530 p2 = b |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
531 if base == p1 or base == p2: |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
532 return False |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
533 return self.issnapshot(base) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
534 |
51099
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
535 def _deltachain(self, rev, stoprev=None): |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
536 """Obtain the delta chain for a revision. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
537 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
538 ``stoprev`` specifies a revision to stop at. If not specified, we |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
539 stop at the base of the chain. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
540 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
541 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
542 revs in ascending order and ``stopped`` is a bool indicating whether |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
543 ``stoprev`` was hit. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
544 """ |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
545 generaldelta = self.delta_config.general_delta |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
546 # Try C implementation. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
547 try: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
548 return self.index.deltachain(rev, stoprev, generaldelta) |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
549 except AttributeError: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
550 pass |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
551 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
552 chain = [] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
553 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
554 # Alias to prevent attribute lookup in tight loop. |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
555 index = self.index |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
556 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
557 iterrev = rev |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
558 e = index[iterrev] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
559 while iterrev != e[3] and iterrev != stoprev: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
560 chain.append(iterrev) |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
561 if generaldelta: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
562 iterrev = e[3] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
563 else: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
564 iterrev -= 1 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
565 e = index[iterrev] |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
566 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
567 if iterrev == stoprev: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
568 stopped = True |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
569 else: |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
570 chain.append(iterrev) |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
571 stopped = False |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
572 |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
573 chain.reverse() |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
574 return chain, stopped |
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
575 |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
576 @util.propertycache |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
577 def _compressor(self): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
578 engine = util.compengines[self.feature_config.compression_engine] |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
579 return engine.revlogcompressor( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
580 self.feature_config.compression_engine_options |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
581 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
582 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
583 @util.propertycache |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
584 def _decompressor(self): |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
585 """the default decompressor""" |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
586 if self._default_compression_header is None: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
587 return None |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
588 t = self._default_compression_header |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
589 c = self._get_decompressor(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
590 return c.decompress |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
591 |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
592 def _get_decompressor(self, t: bytes): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
593 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
594 compressor = self._decompressors[t] |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
595 except KeyError: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
596 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
597 engine = util.compengines.forrevlogheader(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
598 compressor = engine.revlogcompressor( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
599 self.feature_config.compression_engine_options |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
600 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
601 self._decompressors[t] = compressor |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
602 except KeyError: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
603 raise error.RevlogError( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
604 _(b'unknown compression type %s') % binascii.hexlify(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
605 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
606 return compressor |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
607 |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
608 def compress(self, data: bytes) -> Tuple[bytes, bytes]: |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
609 """Generate a possibly-compressed representation of data.""" |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
610 if not data: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
611 return b'', data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
612 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
613 compressed = self._compressor.compress(data) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
614 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
615 if compressed: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
616 # The revlog compressor added the header in the returned data. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
617 return b'', compressed |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
618 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
619 if data[0:1] == b'\0': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
620 return b'', data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
621 return b'u', data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
622 |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
623 def decompress(self, data: bytes): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
624 """Decompress a revlog chunk. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
625 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
626 The chunk is expected to begin with a header identifying the |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
627 format type so it can be routed to an appropriate decompressor. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
628 """ |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
629 if not data: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
630 return data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
631 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
632 # Revlogs are read much more frequently than they are written and many |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
633 # chunks only take microseconds to decompress, so performance is |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
634 # important here. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
635 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
636 # We can make a few assumptions about revlogs: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
637 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
638 # 1) the majority of chunks will be compressed (as opposed to inline |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
639 # raw data). |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
640 # 2) decompressing *any* data will likely by at least 10x slower than |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
641 # returning raw inline data. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
642 # 3) we want to prioritize common and officially supported compression |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
643 # engines |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
644 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
645 # It follows that we want to optimize for "decompress compressed data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
646 # when encoded with common and officially supported compression engines" |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
647 # case over "raw data" and "data encoded by less common or non-official |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
648 # compression engines." That is why we have the inline lookup first |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
649 # followed by the compengines lookup. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
650 # |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
651 # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
652 # compressed chunks. And this matters for changelog and manifest reads. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
653 t = data[0:1] |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
654 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
655 if t == b'x': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
656 try: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
657 return _zlibdecompress(data) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
658 except zlib.error as e: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
659 raise error.RevlogError( |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
660 _(b'revlog decompress error: %s') |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
661 % stringutil.forcebytestr(e) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
662 ) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
663 # '\0' is more common than 'u' so it goes first. |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
664 elif t == b'\0': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
665 return data |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
666 elif t == b'u': |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
667 return util.buffer(data, 1) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
668 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
669 compressor = self._get_decompressor(t) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
670 |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
671 return compressor.decompress(data) |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
672 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
673 @contextlib.contextmanager |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
674 def reading(self): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
675 """Context manager that keeps data and sidedata files open for reading""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
676 if len(self.index) == 0: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
677 yield # nothing to be read |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
678 elif self._delay_buffer is not None and self.inline: |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
679 msg = "revlog with delayed write should not be inline" |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
680 raise error.ProgrammingError(msg) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
681 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
682 with self._segmentfile.reading(): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
683 with self._segmentfile_sidedata.reading(): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
684 yield |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
685 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
686 @property |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
687 def is_writing(self): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
688 """True is a writing context is open""" |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
689 return self._writinghandles is not None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
690 |
51106
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
691 @property |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
692 def is_open(self): |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
693 """True if any file handle is being held |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
694 |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
695 Used for assert and debug in the python code""" |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
696 return self._segmentfile.is_open or self._segmentfile_sidedata.is_open |
594f912818ab
changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51105
diff
changeset
|
697 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
698 @contextlib.contextmanager |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
699 def writing(self, transaction, data_end=None, sidedata_end=None): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
700 """Open the revlog files for writing |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
701 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
702 Add content to a revlog should be done within such context. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
703 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
704 if self.is_writing: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
705 yield |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
706 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
707 ifh = dfh = sdfh = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
708 try: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
709 r = len(self.index) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
710 # opening the data file. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
711 dsize = 0 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
712 if r: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
713 dsize = self.end(r - 1) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
714 dfh = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
715 if not self.inline: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
716 try: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
717 dfh = self.opener(self.data_file, mode=b"r+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
718 if data_end is None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
719 dfh.seek(0, os.SEEK_END) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
720 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
721 dfh.seek(data_end, os.SEEK_SET) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
722 except FileNotFoundError: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
723 dfh = self.opener(self.data_file, mode=b"w+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
724 transaction.add(self.data_file, dsize) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
725 if self.sidedata_file is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
726 assert sidedata_end is not None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
727 # revlog-v2 does not inline, help Pytype |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
728 assert dfh is not None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
729 try: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
730 sdfh = self.opener(self.sidedata_file, mode=b"r+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
731 dfh.seek(sidedata_end, os.SEEK_SET) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
732 except FileNotFoundError: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
733 sdfh = self.opener(self.sidedata_file, mode=b"w+") |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
734 transaction.add(self.sidedata_file, sidedata_end) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
735 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
736 # opening the index file. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
737 isize = r * self.index.entry_size |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
738 ifh = self.__index_write_fp() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
739 if self.inline: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
740 transaction.add(self.index_file, dsize + isize) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
741 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
742 transaction.add(self.index_file, isize) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
743 # exposing all file handle for writing. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
744 self._writinghandles = (ifh, dfh, sdfh) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
745 self._segmentfile.writing_handle = ifh if self.inline else dfh |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
746 self._segmentfile_sidedata.writing_handle = sdfh |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
747 yield |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
748 finally: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
749 self._writinghandles = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
750 self._segmentfile.writing_handle = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
751 self._segmentfile_sidedata.writing_handle = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
752 if dfh is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
753 dfh.close() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
754 if sdfh is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
755 sdfh.close() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
756 # closing the index file last to avoid exposing referent to |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
757 # potential unflushed data content. |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
758 if ifh is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
759 ifh.close() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
760 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
761 def __index_write_fp(self, index_end=None): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
762 """internal method to open the index file for writing |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
763 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
764 You should not use this directly and use `_writing` instead |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
765 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
766 try: |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
767 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
768 f = self.opener( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
769 self.index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
770 mode=b"r+", |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
771 checkambig=self.data_config.check_ambig, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
772 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
773 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
774 # check_ambig affect we way we open file for writing, however |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
775 # here, we do not actually open a file for writting as write |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
776 # will appened to a delay_buffer. So check_ambig is not |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
777 # meaningful and unneeded here. |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
778 f = randomaccessfile.appender( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
779 self.opener, self.index_file, b"r+", self._delay_buffer |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
780 ) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
781 if index_end is None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
782 f.seek(0, os.SEEK_END) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
783 else: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
784 f.seek(index_end, os.SEEK_SET) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
785 return f |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
786 except FileNotFoundError: |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
787 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
788 return self.opener( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
789 self.index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
790 mode=b"w+", |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
791 checkambig=self.data_config.check_ambig, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
792 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
793 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
794 return randomaccessfile.appender( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
795 self.opener, self.index_file, b"w+", self._delay_buffer |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
796 ) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
797 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
798 def __index_new_fp(self): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
799 """internal method to create a new index file for writing |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
800 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
801 You should not use this unless you are upgrading from inline revlog |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
802 """ |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
803 return self.opener( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
804 self.index_file, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
805 mode=b"w", |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
806 checkambig=self.data_config.check_ambig, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
807 ) |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
808 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
809 def split_inline(self, tr, header, new_index_file_path=None): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
810 """split the data of an inline revlog into an index and a data file""" |
51141
962974a5d068
revlog: add one more assert about state of thing when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51139
diff
changeset
|
811 assert self._delay_buffer is None |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
812 existing_handles = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
813 if self._writinghandles is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
814 existing_handles = True |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
815 fp = self._writinghandles[0] |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
816 fp.flush() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
817 fp.close() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
818 # We can't use the cached file handle after close(). So prevent |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
819 # its usage. |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
820 self._writinghandles = None |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
821 self._segmentfile.writing_handle = None |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
822 # No need to deal with sidedata writing handle as it is only |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
823 # relevant with revlog-v2 which is never inline, not reaching |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
824 # this code |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
825 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
826 new_dfh = self.opener(self.data_file, mode=b"w+") |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
827 new_dfh.truncate(0) # drop any potentially existing data |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
828 try: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
829 with self.reading(): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
830 for r in range(len(self.index)): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
831 new_dfh.write(self.get_segment_for_revs(r, r)[1]) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
832 new_dfh.flush() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
833 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
834 if new_index_file_path is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
835 self.index_file = new_index_file_path |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
836 with self.__index_new_fp() as fp: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
837 self.inline = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
838 for i in range(len(self.index)): |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
839 e = self.index.entry_binary(i) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
840 if i == 0: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
841 packed_header = self.index.pack_header(header) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
842 e = packed_header + e |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
843 fp.write(e) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
844 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
845 # If we don't use side-write, the temp file replace the real |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
846 # index when we exit the context manager |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
847 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
848 self._segmentfile = randomaccessfile.randomaccessfile( |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
849 self.opener, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
850 self.data_file, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
851 self.data_config.chunk_cache_size, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
852 ) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
853 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
854 if existing_handles: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
855 # switched from inline to conventional reopen the index |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
856 ifh = self.__index_write_fp() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
857 self._writinghandles = (ifh, new_dfh, None) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
858 self._segmentfile.writing_handle = new_dfh |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
859 new_dfh = None |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
860 # No need to deal with sidedata writing handle as it is only |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
861 # relevant with revlog-v2 which is never inline, not reaching |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
862 # this code |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
863 finally: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
864 if new_dfh is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
865 new_dfh.close() |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
866 return self.index_file |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
867 |
51091
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
868 def get_segment_for_revs(self, startrev, endrev): |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
869 """Obtain a segment of raw data corresponding to a range of revisions. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
870 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
871 Accepts the start and end revisions and an optional already-open |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
872 file handle to be used for reading. If the file handle is read, its |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
873 seek position will not be preserved. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
874 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
875 Requests for data may be satisfied by a cache. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
876 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
877 Returns a 2-tuple of (offset, data) for the requested range of |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
878 revisions. Offset is the integer offset from the beginning of the |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
879 revlog and data is a str or buffer of the raw byte data. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
880 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
881 Callers will need to call ``self.start(rev)`` and ``self.length(rev)`` |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
882 to determine where each revision's data begins and ends. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
883 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
884 API: we should consider making this a private part of the InnerRevlog |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
885 at some point. |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
886 """ |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
887 # Inlined self.start(startrev) & self.end(endrev) for perf reasons |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
888 # (functions are expensive). |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
889 index = self.index |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
890 istart = index[startrev] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
891 start = int(istart[0] >> 16) |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
892 if startrev == endrev: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
893 end = start + istart[1] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
894 else: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
895 iend = index[endrev] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
896 end = int(iend[0] >> 16) + iend[1] |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
897 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
898 if self.inline: |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
899 start += (startrev + 1) * self.index.entry_size |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
900 end += (endrev + 1) * self.index.entry_size |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
901 length = end - start |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
902 |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
903 return start, self._segmentfile.read_chunk(start, length) |
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
904 |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
905 def _chunk(self, rev): |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
906 """Obtain a single decompressed chunk for a revision. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
907 |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
908 Accepts an integer revision and an optional already-open file handle |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
909 to be used for reading. If used, the seek position of the file will not |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
910 be preserved. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
911 |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
912 Returns a str holding uncompressed data for the requested revision. |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
913 """ |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
914 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
915 uncomp = self._uncompressed_chunk_cache.get(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
916 if uncomp is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
917 return uncomp |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
918 |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
919 compression_mode = self.index[rev][10] |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
920 data = self.get_segment_for_revs(rev, rev)[1] |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
921 if compression_mode == COMP_MODE_PLAIN: |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
922 uncomp = data |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
923 elif compression_mode == COMP_MODE_DEFAULT: |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
924 uncomp = self._decompressor(data) |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
925 elif compression_mode == COMP_MODE_INLINE: |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
926 uncomp = self.decompress(data) |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
927 else: |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
928 msg = b'unknown compression mode %d' |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
929 msg %= compression_mode |
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
930 raise error.RevlogError(msg) |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
931 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
932 self._uncompressed_chunk_cache.insert(rev, uncomp, cost=len(uncomp)) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
933 return uncomp |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
934 |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
935 def _chunks(self, revs, targetsize=None): |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
936 """Obtain decompressed chunks for the specified revisions. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
937 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
938 Accepts an iterable of numeric revisions that are assumed to be in |
51893
eb9dea148233
revlog: cleanup some outdated docstrings
Raphaël Gomès <rgomes@octobus.net>
parents:
51868
diff
changeset
|
939 ascending order. |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
940 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
941 This function is similar to calling ``self._chunk()`` multiple times, |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
942 but is faster. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
943 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
944 Returns a list with decompressed data for each requested revision. |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
945 """ |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
946 if not revs: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
947 return [] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
948 start = self.start |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
949 length = self.length |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
950 inline = self.inline |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
951 iosize = self.index.entry_size |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
952 buffer = util.buffer |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
953 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
954 fetched_revs = [] |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
955 fadd = fetched_revs.append |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
956 |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
957 chunks = [] |
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
958 ladd = chunks.append |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
959 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
960 if self._uncompressed_chunk_cache is None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
961 fetched_revs = revs |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
962 else: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
963 for rev in revs: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
964 cached_value = self._uncompressed_chunk_cache.get(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
965 if cached_value is None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
966 fadd(rev) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
967 else: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
968 ladd((rev, cached_value)) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
969 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
970 if not fetched_revs: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
971 slicedchunks = () |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
972 elif not self.data_config.with_sparse_read: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
973 slicedchunks = (fetched_revs,) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
974 else: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
975 slicedchunks = deltautil.slicechunk( |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
976 self, |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
977 fetched_revs, |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
978 targetsize=targetsize, |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
979 ) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
980 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
981 for revschunk in slicedchunks: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
982 firstrev = revschunk[0] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
983 # Skip trailing revisions with empty diff |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
984 for lastrev in revschunk[::-1]: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
985 if length(lastrev) != 0: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
986 break |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
987 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
988 try: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
989 offset, data = self.get_segment_for_revs(firstrev, lastrev) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
990 except OverflowError: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
991 # issue4215 - we can't cache a run of chunks greater than |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
992 # 2G on Windows |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
993 for rev in revschunk: |
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
994 ladd((rev, self._chunk(rev))) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
995 |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
996 decomp = self.decompress |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
997 # self._decompressor might be None, but will not be used in that case |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
998 def_decomp = self._decompressor |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
999 for rev in revschunk: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1000 chunkstart = start(rev) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1001 if inline: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1002 chunkstart += (rev + 1) * iosize |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1003 chunklength = length(rev) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1004 comp_mode = self.index[rev][10] |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1005 c = buffer(data, chunkstart - offset, chunklength) |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1006 if comp_mode == COMP_MODE_PLAIN: |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
1007 c = c |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1008 elif comp_mode == COMP_MODE_INLINE: |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
1009 c = decomp(c) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1010 elif comp_mode == COMP_MODE_DEFAULT: |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
1011 c = def_decomp(c) |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1012 else: |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1013 msg = b'unknown compression mode %d' |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1014 msg %= comp_mode |
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1015 raise error.RevlogError(msg) |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
1016 ladd((rev, c)) |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1017 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1018 self._uncompressed_chunk_cache.insert(rev, c, len(c)) |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1019 |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1020 chunks.sort() |
51111
c2d2e5b65def
revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51110
diff
changeset
|
1021 return [x[1] for x in chunks] |
51098
e8ad6d8de8b8
revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51097
diff
changeset
|
1022 |
51898
8c39ba94acce
typing: explicitly set the return type of `_InnerRevLog.raw_text()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51896
diff
changeset
|
1023 def raw_text(self, node, rev) -> bytes: |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1024 """return the possibly unvalidated rawtext for a revision |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1025 |
51894
384016e91947
revlog: simplify rawtext return value
Raphaël Gomès <rgomes@octobus.net>
parents:
51893
diff
changeset
|
1026 returns rawtext |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1027 """ |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1028 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1029 # revision in the cache (could be useful to apply delta) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1030 cachedrev = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1031 # An intermediate text to apply deltas to |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1032 basetext = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1033 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1034 # Check if we have the entry in cache |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1035 # The cache entry looks like (node, rev, rawtext) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1036 if self._revisioncache: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1037 cachedrev = self._revisioncache[1] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1038 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1039 chain, stopped = self._deltachain(rev, stoprev=cachedrev) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1040 if stopped: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1041 basetext = self._revisioncache[2] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1042 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1043 # drop cache to save memory, the caller is expected to |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1044 # update self._inner._revisioncache after validating the text |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1045 self._revisioncache = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1046 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1047 targetsize = None |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1048 rawsize = self.index[rev][2] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1049 if 0 <= rawsize: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1050 targetsize = 4 * rawsize |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1051 |
51112
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1052 if self._uncompressed_chunk_cache is not None: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1053 # dynamically update the uncompressed_chunk_cache size to the |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1054 # largest revision we saw in this revlog. |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1055 factor = self.data_config.uncompressed_cache_factor |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1056 candidate_size = rawsize * factor |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1057 if candidate_size > self._uncompressed_chunk_cache.maxcost: |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1058 self._uncompressed_chunk_cache.maxcost = candidate_size |
0250e45040f1
revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51111
diff
changeset
|
1059 |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1060 bins = self._chunks(chain, targetsize=targetsize) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1061 if basetext is None: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1062 basetext = bytes(bins[0]) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1063 bins = bins[1:] |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1064 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1065 rawtext = mdiff.patches(basetext, bins) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1066 del basetext # let us have a chance to free memory early |
51894
384016e91947
revlog: simplify rawtext return value
Raphaël Gomès <rgomes@octobus.net>
parents:
51893
diff
changeset
|
1067 return rawtext |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
1068 |
51102
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1069 def sidedata(self, rev, sidedata_end): |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1070 """Return the sidedata for a given revision number.""" |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1071 index_entry = self.index[rev] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1072 sidedata_offset = index_entry[8] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1073 sidedata_size = index_entry[9] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1074 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1075 if self.inline: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1076 sidedata_offset += self.index.entry_size * (1 + rev) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1077 if sidedata_size == 0: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1078 return {} |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1079 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1080 if sidedata_end < sidedata_offset + sidedata_size: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1081 filename = self.sidedata_file |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1082 end = sidedata_end |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1083 offset = sidedata_offset |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1084 length = sidedata_size |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1085 m = FILE_TOO_SHORT_MSG % (filename, length, offset, end) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1086 raise error.RevlogError(m) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1087 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1088 comp_segment = self._segmentfile_sidedata.read_chunk( |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1089 sidedata_offset, sidedata_size |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1090 ) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1091 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1092 comp = self.index[rev][11] |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1093 if comp == COMP_MODE_PLAIN: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1094 segment = comp_segment |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1095 elif comp == COMP_MODE_DEFAULT: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1096 segment = self._decompressor(comp_segment) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1097 elif comp == COMP_MODE_INLINE: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1098 segment = self.decompress(comp_segment) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1099 else: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1100 msg = b'unknown compression mode %d' |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1101 msg %= comp |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1102 raise error.RevlogError(msg) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1103 |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1104 sidedata = sidedatautil.deserialize_sidedata(segment) |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1105 return sidedata |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
1106 |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1107 def write_entry( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1108 self, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1109 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1110 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1111 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1112 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1113 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1114 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1115 sidedata_offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1116 index_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1117 data_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1118 sidedata_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1119 ): |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1120 # Files opened in a+ mode have inconsistent behavior on various |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1121 # platforms. Windows requires that a file positioning call be made |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1122 # when the file handle transitions between reads and writes. See |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1123 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1124 # platforms, Python or the platform itself can be buggy. Some versions |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1125 # of Solaris have been observed to not append at the end of the file |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1126 # if the file was seeked to before the end. See issue4943 for more. |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1127 # |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1128 # We work around this issue by inserting a seek() before writing. |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1129 # Note: This is likely not necessary on Python 3. However, because |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1130 # the file handle is reused for reads and may be seeked there, we need |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1131 # to be careful before changing this. |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1132 if self._writinghandles is None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1133 msg = b'adding revision outside `revlog._writing` context' |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1134 raise error.ProgrammingError(msg) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1135 ifh, dfh, sdfh = self._writinghandles |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1136 if index_end is None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1137 ifh.seek(0, os.SEEK_END) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1138 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1139 ifh.seek(index_end, os.SEEK_SET) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1140 if dfh: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1141 if data_end is None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1142 dfh.seek(0, os.SEEK_END) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1143 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1144 dfh.seek(data_end, os.SEEK_SET) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1145 if sdfh: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1146 sdfh.seek(sidedata_end, os.SEEK_SET) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1147 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1148 curr = len(self.index) - 1 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1149 if not self.inline: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1150 transaction.add(self.data_file, offset) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1151 if self.sidedata_file: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1152 transaction.add(self.sidedata_file, sidedata_offset) |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
1153 transaction.add(self.canonical_index_file, curr * len(entry)) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1154 if data[0]: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1155 dfh.write(data[0]) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1156 dfh.write(data[1]) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1157 if sidedata: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1158 sdfh.write(sidedata) |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1159 if self._delay_buffer is None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1160 ifh.write(entry) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1161 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1162 self._delay_buffer.append(entry) |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1163 elif self._delay_buffer is not None: |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1164 msg = b'invalid delayed write on inline revlog' |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1165 raise error.ProgrammingError(msg) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1166 else: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1167 offset += curr * self.index.entry_size |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
1168 transaction.add(self.canonical_index_file, offset) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1169 assert not sidedata |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1170 ifh.write(entry) |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1171 ifh.write(data[0]) |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1172 ifh.write(data[1]) |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1173 return ( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1174 ifh.tell(), |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1175 dfh.tell() if dfh else None, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1176 sdfh.tell() if sdfh else None, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1177 ) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
1178 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1179 def _divert_index(self): |
51506
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1180 index_file = self.index_file |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1181 # when we encounter a legacy inline-changelog, split it. However it is |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1182 # important to use the expected filename for pending content |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1183 # (<radix>.a) otherwise hooks won't be seeing the content of the |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1184 # pending transaction. |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1185 if index_file.endswith(b'.s'): |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1186 index_file = self.index_file[:-2] |
1721d983dd6d
inline-changelog: fix pending transaction visibility when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51505
diff
changeset
|
1187 return index_file + b'.a' |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1188 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1189 def delay(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1190 assert not self.is_open |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1191 if self.inline: |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1192 msg = "revlog with delayed write should not be inline" |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1193 raise error.ProgrammingError(msg) |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1194 if self._delay_buffer is not None or self._orig_index_file is not None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1195 # delay or divert already in place |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1196 return None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1197 elif len(self.index) == 0: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1198 self._orig_index_file = self.index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1199 self.index_file = self._divert_index() |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1200 assert self._orig_index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1201 assert self.index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1202 if self.opener.exists(self.index_file): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1203 self.opener.unlink(self.index_file) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1204 return self.index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1205 else: |
51142
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1206 self._delay_buffer = [] |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1207 return None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1208 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1209 def write_pending(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1210 assert not self.is_open |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1211 if self.inline: |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1212 msg = "revlog with delayed write should not be inline" |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1213 raise error.ProgrammingError(msg) |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1214 if self._orig_index_file is not None: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1215 return None, True |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1216 any_pending = False |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1217 pending_index_file = self._divert_index() |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1218 if self.opener.exists(pending_index_file): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1219 self.opener.unlink(pending_index_file) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1220 util.copyfile( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1221 self.opener.join(self.index_file), |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1222 self.opener.join(pending_index_file), |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1223 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1224 if self._delay_buffer: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1225 with self.opener(pending_index_file, b'r+') as ifh: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1226 ifh.seek(0, os.SEEK_END) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1227 ifh.write(b"".join(self._delay_buffer)) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1228 any_pending = True |
51142
66417f55ea33
revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51141
diff
changeset
|
1229 self._delay_buffer = None |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1230 self._orig_index_file = self.index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1231 self.index_file = pending_index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1232 return self.index_file, any_pending |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1233 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1234 def finalize_pending(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1235 assert not self.is_open |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1236 if self.inline: |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1237 msg = "revlog with delayed write should not be inline" |
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1238 raise error.ProgrammingError(msg) |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1239 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1240 delay = self._delay_buffer is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1241 divert = self._orig_index_file is not None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1242 |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1243 if delay and divert: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1244 assert False, "unreachable" |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1245 elif delay: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1246 if self._delay_buffer: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1247 with self.opener(self.index_file, b'r+') as ifh: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1248 ifh.seek(0, os.SEEK_END) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1249 ifh.write(b"".join(self._delay_buffer)) |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
1250 self._delay_buffer = None |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1251 elif divert: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1252 if self.opener.exists(self.index_file): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1253 self.opener.rename( |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1254 self.index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1255 self._orig_index_file, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1256 checkambig=True, |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1257 ) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1258 self.index_file = self._orig_index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1259 self._orig_index_file = None |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1260 else: |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1261 msg = b"not delay or divert found on this revlog" |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1262 raise error.ProgrammingError(msg) |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1263 return self.canonical_index_file |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
1264 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1265 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49019
diff
changeset
|
1266 class revlog: |
1083 | 1267 """ |
1268 the underlying revision storage object | |
1269 | |
1270 A revlog consists of two parts, an index and the revision data. | |
1271 | |
1272 The index is a file with a fixed record size containing | |
6912 | 1273 information on each revision, including its nodeid (hash), the |
1083 | 1274 nodeids of its parents, the position and offset of its data within |
1275 the data file, and the revision it's based on. Finally, each entry | |
1276 contains a linkrev entry that can serve as a pointer to external | |
1277 data. | |
1278 | |
1279 The revision data itself is a linear collection of data chunks. | |
1280 Each chunk represents a revision and is usually represented as a | |
1281 delta against the previous chunk. To bound lookup time, runs of | |
1282 deltas are limited to about 2 times the length of the original | |
1283 version data. This makes retrieval of a version proportional to | |
1284 its size, or O(1) relative to the number of revisions. | |
1285 | |
1286 Both pieces of the revlog are written to in an append-only | |
1287 fashion, which means we never need to rewrite a file to insert or | |
1288 remove data, and can use some simple techniques to avoid the need | |
1289 for locking while reading. | |
30001
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
1290 |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
1291 If checkambig, indexfile is opened with checkambig=True at |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
1292 writing, to avoid file stat ambiguity. |
34303
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1293 |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1294 If mmaplargeindex is True, and an mmapindexthreshold is set, the |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1295 index will be mmapped rather than read if it is larger than the |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
1296 configured threshold. |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1297 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1298 If censorable is True, the revlog can have censored revisions. |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1299 |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1300 If `upperboundcomp` is not None, this is the expected maximal gain from |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1301 compression for the data content. |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1302 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1303 `concurrencychecker` is an optional function that receives 3 arguments: a |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1304 file handle, a filename, and an expected position. It should check whether |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1305 the current position in the file handle is valid, and log/warn/fail (by |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1306 raising). |
47257
02a4463565ea
revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
1307 |
47399
7a0ec25d5836
revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47397
diff
changeset
|
1308 See mercurial/revlogutils/contants.py for details about the content of an |
7a0ec25d5836
revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47397
diff
changeset
|
1309 index entry. |
1083 | 1310 """ |
42996
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
1311 |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
1312 _flagserrorclass = error.RevlogError |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
1313 |
51862
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
1314 opener: vfsmod.vfs |
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
1315 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1316 @staticmethod |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1317 def is_inline_index(header_bytes): |
51007
4ea606568f61
revlog: document the `is_inline_index` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50952
diff
changeset
|
1318 """Determine if a revlog is inline from the initial bytes of the index""" |
50789
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50761
diff
changeset
|
1319 if len(header_bytes) == 0: |
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50761
diff
changeset
|
1320 return True |
74c004a515bc
stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50761
diff
changeset
|
1321 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1322 header = INDEX_HEADER.unpack(header_bytes)[0] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1323 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1324 _format_flags = header & ~0xFFFF |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1325 _format_version = header & 0xFFFF |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1326 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1327 features = FEATURES_BY_VERSION[_format_version] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1328 return features[b'inline'](_format_flags) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1329 |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
1330 _docket_file: Optional[bytes] |
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
1331 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1332 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1333 self, |
51862
71fb6e0a7a35
typing: add type hints to the `opener` attributes and arguments of revlog
Matt Harbison <matt_harbison@yahoo.com>
parents:
51788
diff
changeset
|
1334 opener: vfsmod.vfs, |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1335 target, |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1336 radix, |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1337 postfix=None, # only exist for `tmpcensored` now |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1338 checkambig=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1339 mmaplargeindex=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1340 censorable=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1341 upperboundcomp=None, |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
1342 persistentnodemap=False, |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1343 concurrencychecker=None, |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1344 trypending=False, |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
1345 try_split=False, |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
1346 canonical_parent_order=True, |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1347 data_config=None, |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1348 delta_config=None, |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1349 feature_config=None, |
51139
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1350 may_inline=True, # may inline new revlog |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1351 ): |
1083 | 1352 """ |
1353 create a revlog object | |
1354 | |
1355 opener is a function that abstracts the file opening operation | |
1356 and can be used to implement COW semantics or the like. | |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
1357 |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1358 `target`: a (KIND, ID) tuple that identify the content stored in |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1359 this revlog. It help the rest of the code to understand what the revlog |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1360 is about without having to resort to heuristic and index filename |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1361 analysis. Note: that this must be reliably be set by normal code, but |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1362 that test, debug, or performance measurement code might not set this to |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1363 accurate value. |
1083 | 1364 """ |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1365 |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1366 self.radix = radix |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
1367 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1368 self._docket_file = None |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1369 self._indexfile = None |
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1370 self._datafile = None |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1371 self._sidedatafile = None |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1372 self._nodemap_file = None |
47159
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
1373 self.postfix = postfix |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1374 self._trypending = trypending |
50316
87f0155d68aa
revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49923
diff
changeset
|
1375 self._try_split = try_split |
51139
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1376 self._may_inline = may_inline |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
1377 self.opener = opener |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
1378 if persistentnodemap: |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1379 self._nodemap_file = nodemaputil.get_nodemap_file(self) |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
1380 |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1381 assert target[0] in ALL_KINDS |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1382 assert len(target) == 2 |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
1383 self.target = target |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1384 if feature_config is not None: |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1385 self.feature_config = feature_config.copy() |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1386 elif b'feature-config' in self.opener.options: |
51036
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1387 self.feature_config = self.opener.options[b'feature-config'].copy() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1388 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1389 self.feature_config = FeatureConfig() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1390 self.feature_config.censorable = censorable |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1391 self.feature_config.canonical_parent_order = canonical_parent_order |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1392 if data_config is not None: |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1393 self.data_config = data_config.copy() |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1394 elif b'data-config' in self.opener.options: |
51036
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1395 self.data_config = self.opener.options[b'data-config'].copy() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1396 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1397 self.data_config = DataConfig() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1398 self.data_config.check_ambig = checkambig |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1399 self.data_config.mmap_large_index = mmaplargeindex |
51138
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1400 if delta_config is not None: |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1401 self.delta_config = delta_config.copy() |
c136c797740e
revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51116
diff
changeset
|
1402 elif b'delta-config' in self.opener.options: |
51036
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1403 self.delta_config = self.opener.options[b'delta-config'].copy() |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1404 else: |
133f5a54ed9d
revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51035
diff
changeset
|
1405 self.delta_config = DeltaConfig() |
51087
5645524c6b62
revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51086
diff
changeset
|
1406 self.delta_config.upper_bound_comp = upperboundcomp |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1407 |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1408 # Maps rev to chain base rev. |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1409 self._chainbasecache = util.lrucachedict(100) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1410 |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
1411 self.index = None |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1412 self._docket = None |
44366
76a96e3a2bbb
nodemap: keep track of the docket for loaded data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
1413 self._nodemap_docket = None |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1414 # 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
|
1415 self._pcache = {} |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
1416 |
49778
45d7b8c380d7
changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49772
diff
changeset
|
1417 # other optionnals features |
45d7b8c380d7
changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49772
diff
changeset
|
1418 |
39784
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
1419 # Make copy of flag processors so each revlog instance can support |
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
1420 # custom flags. |
42746
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42745
diff
changeset
|
1421 self._flagprocessors = dict(flagutil.flagprocessors) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
1422 # prevent nesting of addgroup |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
1423 self._adding_group = None |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
1424 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1425 chunk_cache = self._loadindex() |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1426 self._load_inner(chunk_cache) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1427 self._concurrencychecker = concurrencychecker |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
1428 |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1429 def _init_opts(self): |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1430 """process options (from above/config) to setup associated default revlog mode |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1431 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1432 These values might be affected when actually reading on disk information. |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1433 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1434 The relevant values are returned for use in _loadindex(). |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1435 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1436 * newversionflags: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1437 version header to use if we need to create a new revlog |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1438 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1439 * mmapindexthreshold: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1440 minimal index size for start to use mmap |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1441 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1442 * force_nodemap: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1443 force the usage of a "development" version of the nodemap code |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1444 """ |
43027
3518da504303
vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43026
diff
changeset
|
1445 opts = self.opener.options |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1446 |
47274
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
1447 if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG: |
47277
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47274
diff
changeset
|
1448 new_header = CHANGELOGV2 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1449 compute_rank = opts.get(b'changelogv2.compute-rank', True) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1450 self.feature_config.compute_rank = compute_rank |
47274
6c84fc9c9a90
changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
1451 elif b'revlogv2' in opts: |
47272
80164d50ae3d
revlogv2: no longer attempt to use inline for new revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
1452 new_header = REVLOGV2 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1453 elif b'revlogv1' in opts: |
51139
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1454 new_header = REVLOGV1 |
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1455 if self._may_inline: |
e9eac01c57f3
revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51138
diff
changeset
|
1456 new_header |= FLAG_INLINE_DATA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1457 if b'generaldelta' in opts: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1458 new_header |= FLAG_GENERALDELTA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1459 elif b'revlogv0' in self.opener.options: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1460 new_header = REVLOGV0 |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1461 else: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1462 new_header = REVLOG_DEFAULT_VERSION |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1463 |
51047
027bc364524b
revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
1464 mmapindexthreshold = None |
51054
3977068c638c
revlog: remove legacy usage of `_mmaplargeindex`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51053
diff
changeset
|
1465 if self.data_config.mmap_large_index: |
51047
027bc364524b
revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51046
diff
changeset
|
1466 mmapindexthreshold = self.data_config.mmap_index_threshold |
51046
683b96c416d8
revlog: skip opener options to pass enable_ellipsis
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51045
diff
changeset
|
1467 if self.feature_config.enable_ellipsis: |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1468 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1469 |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
1470 # revlog v0 doesn't have flag processors |
49019
ceafb0f81250
revlog: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49004
diff
changeset
|
1471 for flag, processor in opts.get(b'flagprocessors', {}).items(): |
42748
5109217a9ab6
flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42747
diff
changeset
|
1472 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
|
1473 |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1474 chunk_cache_size = self.data_config.chunk_cache_size |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1475 if chunk_cache_size <= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1476 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
|
1477 _(b'revlog chunk cache size %r is not greater than 0') |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1478 % chunk_cache_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1479 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1480 elif chunk_cache_size & (chunk_cache_size - 1): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1481 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
|
1482 _(b'revlog chunk cache size %r is not a power of 2') |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1483 % chunk_cache_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1484 ) |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1485 force_nodemap = opts.get(b'devel-force-nodemap', False) |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1486 return new_header, mmapindexthreshold, force_nodemap |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1487 |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1488 def _get_data(self, filepath, mmap_threshold, size=None): |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1489 """return a file content with or without mmap |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1490 |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1491 If the file is missing return the empty string""" |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1492 try: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1493 with self.opener(filepath) as fp: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1494 if mmap_threshold is not None: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1495 file_size = self.opener.fstat(fp).st_size |
51650
d6c895e4adc4
mmap: only use mmap to read revlog index if it is safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51506
diff
changeset
|
1496 if ( |
d6c895e4adc4
mmap: only use mmap to read revlog index if it is safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51506
diff
changeset
|
1497 file_size >= mmap_threshold |
d6c895e4adc4
mmap: only use mmap to read revlog index if it is safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51506
diff
changeset
|
1498 and self.opener.is_mmap_safe(filepath) |
d6c895e4adc4
mmap: only use mmap to read revlog index if it is safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51506
diff
changeset
|
1499 ): |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1500 if size is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1501 # avoid potentiel mmap crash |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1502 size = min(file_size, size) |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1503 # TODO: should .close() to release resources without |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1504 # relying on Python GC |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1505 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1506 return util.buffer(util.mmapread(fp)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1507 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1508 return util.buffer(util.mmapread(fp, size)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1509 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1510 return fp.read() |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1511 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1512 return fp.read(size) |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
1513 except FileNotFoundError: |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1514 return b'' |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1515 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1516 def get_streams(self, max_linkrev, force_inline=False): |
51008
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1517 """return a list of streams that represent this revlog |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1518 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1519 This is used by stream-clone to do bytes to bytes copies of a repository. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1520 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1521 This streams data for all revisions that refer to a changelog revision up |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1522 to `max_linkrev`. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1523 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1524 If `force_inline` is set, it enforces that the stream will represent an inline revlog. |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1525 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1526 It returns is a list of three-tuple: |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1527 |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1528 [ |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1529 (filename, bytes_stream, stream_size), |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1530 … |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1531 ] |
273434748051
revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51007
diff
changeset
|
1532 """ |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1533 n = len(self) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1534 index = self.index |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1535 while n > 0: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1536 linkrev = index[n - 1][4] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1537 if linkrev < max_linkrev: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1538 break |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1539 # note: this loop will rarely go through multiple iterations, since |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1540 # it only traverses commits created during the current streaming |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1541 # pull operation. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1542 # |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1543 # If this become a problem, using a binary search should cap the |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1544 # runtime of this. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1545 n = n - 1 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1546 if n == 0: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1547 # no data to send |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1548 return [] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1549 index_size = n * index.entry_size |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1550 data_size = self.end(n - 1) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1551 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1552 # XXX we might have been split (or stripped) since the object |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1553 # initialization, We need to close this race too, but having a way to |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1554 # pre-open the file we feed to the revlog and never closing them before |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1555 # we are done streaming. |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1556 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1557 if self._inline: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1558 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1559 def get_stream(): |
51085
5ffee3cff8de
revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51084
diff
changeset
|
1560 with self.opener(self._indexfile, mode=b"r") as fp: |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1561 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1562 size = index_size + data_size |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1563 if size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1564 yield fp.read(size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1565 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1566 yield from util.filechunkiter(fp, limit=size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1567 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1568 inline_stream = get_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1569 next(inline_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1570 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1571 (self._indexfile, inline_stream, index_size + data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1572 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1573 elif force_inline: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1574 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1575 def get_stream(): |
51023
720e5a5f2b95
stream-clone: use `revlog.reading` in `revlog.get_streams`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51021
diff
changeset
|
1576 with self.reading(): |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1577 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1578 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1579 for rev in range(n): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1580 idx = self.index.entry_binary(rev) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1581 if rev == 0 and self._docket is None: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1582 # re-inject the inline flag |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1583 header = self._format_flags |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1584 header |= self._format_version |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1585 header |= FLAG_INLINE_DATA |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1586 header = self.index.pack_header(header) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1587 idx = header + idx |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1588 yield idx |
51091
df50a1592e0c
revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51090
diff
changeset
|
1589 yield self._inner.get_segment_for_revs(rev, rev)[1] |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1590 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1591 inline_stream = get_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1592 next(inline_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1593 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1594 (self._indexfile, inline_stream, index_size + data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1595 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1596 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1597 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1598 def get_index_stream(): |
51085
5ffee3cff8de
revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51084
diff
changeset
|
1599 with self.opener(self._indexfile, mode=b"r") as fp: |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1600 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1601 if index_size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1602 yield fp.read(index_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1603 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1604 yield from util.filechunkiter(fp, limit=index_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1605 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1606 def get_data_stream(): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1607 with self._datafp() as fp: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1608 yield None |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1609 if data_size <= 65536: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1610 yield fp.read(data_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1611 else: |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1612 yield from util.filechunkiter(fp, limit=data_size) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1613 |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1614 index_stream = get_index_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1615 next(index_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1616 data_stream = get_data_stream() |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1617 next(data_stream) |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1618 return [ |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1619 (self._datafile, data_stream, data_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1620 (self._indexfile, index_stream, index_size), |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1621 ] |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1622 |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1623 def _loadindex(self, docket=None): |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
1624 new_header, mmapindexthreshold, force_nodemap = self._init_opts() |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1625 |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1626 if self.postfix is not None: |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1627 entry_point = b'%s.i.%s' % (self.radix, self.postfix) |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1628 elif self._trypending and self.opener.exists(b'%s.i.a' % self.radix): |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1629 entry_point = b'%s.i.a' % self.radix |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
1630 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
|
1631 entry_point = self._split_index_file |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
1632 else: |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1633 entry_point = b'%s.i' % self.radix |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
1634 |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1635 if docket is not None: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1636 self._docket = docket |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1637 self._docket_file = entry_point |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
1638 else: |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1639 self._initempty = True |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1640 entry_data = self._get_data(entry_point, mmapindexthreshold) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1641 if len(entry_data) > 0: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1642 header = INDEX_HEADER.unpack(entry_data[:4])[0] |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1643 self._initempty = False |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1644 else: |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1645 header = new_header |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1646 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1647 self._format_flags = header & ~0xFFFF |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1648 self._format_version = header & 0xFFFF |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1649 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1650 supported_flags = SUPPORTED_FLAGS.get(self._format_version) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1651 if supported_flags is None: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1652 msg = _(b'unknown version (%d) in revlog %s') |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1653 msg %= (self._format_version, self.display_id) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1654 raise error.RevlogError(msg) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1655 elif self._format_flags & ~supported_flags: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1656 msg = _(b'unknown flags (%#04x) in version %d revlog %s') |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1657 display_flag = self._format_flags >> 16 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1658 msg %= (display_flag, self._format_version, self.display_id) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1659 raise error.RevlogError(msg) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1660 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1661 features = FEATURES_BY_VERSION[self._format_version] |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1662 self._inline = features[b'inline'](self._format_flags) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1663 self.delta_config.general_delta = features[b'generaldelta']( |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1664 self._format_flags |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1665 ) |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1666 self.feature_config.has_side_data = features[b'sidedata'] |
47408
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1667 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1668 if not features[b'docket']: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1669 self._indexfile = entry_point |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1670 index_data = entry_data |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1671 else: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1672 self._docket_file = entry_point |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1673 if self._initempty: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1674 self._docket = docketutil.default_docket(self, header) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1675 else: |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1676 self._docket = docketutil.parse_docket( |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1677 self, entry_data, use_pending=self._trypending |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1678 ) |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1679 |
f7f082bc0e7c
revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47405
diff
changeset
|
1680 if self._docket is not None: |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1681 self._indexfile = self._docket.index_filepath() |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1682 index_data = b'' |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1683 index_size = self._docket.index_end |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1684 if index_size > 0: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1685 index_data = self._get_data( |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1686 self._indexfile, mmapindexthreshold, size=index_size |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1687 ) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1688 if len(index_data) < index_size: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1689 msg = _(b'too few index data for %s: got %d, expected %d') |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1690 msg %= (self.display_id, len(index_data), index_size) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1691 raise error.RevlogError(msg) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
1692 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1693 self._inline = False |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1694 # generaldelta implied by version 2 revlogs. |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1695 self.delta_config.general_delta = True |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1696 # the logic for persistent nodemap will be dealt with within the |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1697 # main docket, so disable it for now. |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
1698 self._nodemap_file = None |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1699 |
47332
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47305
diff
changeset
|
1700 if self._docket is not None: |
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47305
diff
changeset
|
1701 self._datafile = self._docket.data_filepath() |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1702 self._sidedatafile = self._docket.sidedata_filepath() |
47332
0a3fa41fa719
revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47305
diff
changeset
|
1703 elif self.postfix is None: |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1704 self._datafile = b'%s.d' % self.radix |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1705 else: |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1706 self._datafile = b'%s.d.%s' % (self.radix, self.postfix) |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
1707 |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
1708 self.nodeconstants = sha1nodeconstants |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
1709 self.nullid = self.nodeconstants.nullid |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
1710 |
41312
189e06b2d719
revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents:
41310
diff
changeset
|
1711 # sparse-revlog can't be on without general-delta (issue6056) |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
1712 if not self.delta_config.general_delta: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
1713 self.delta_config.sparse_revlog = False |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
1714 |
39260
0a5b20c107a6
repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39259
diff
changeset
|
1715 self._storedeltachains = True |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30014
diff
changeset
|
1716 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1717 devel_nodemap = ( |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1718 self._nodemap_file |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
1719 and force_nodemap |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1720 and parse_index_v1_nodemap is not None |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1721 ) |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1722 |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1723 use_rust_index = False |
51426
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1724 if rustrevlog is not None and self._nodemap_file is not None: |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1725 # we would like to use the rust_index in all case, especially |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1726 # because it is necessary for AncestorsIterator and LazyAncestors |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1727 # since the 6.7 cycle. |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1728 # |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1729 # However, the performance impact of inconditionnaly building the |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1730 # nodemap is currently a problem for non-persistent nodemap |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1731 # repository. |
def497c75351
rust: disable the RustIndex without persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51394
diff
changeset
|
1732 use_rust_index = True |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1733 |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1734 self._parse_index = parse_index_v1 |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
1735 if self._format_version == REVLOGV0: |
47079
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
1736 self._parse_index = revlogv0.parse_index_v0 |
47187
ef7a8a1622ad
revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
1737 elif self._format_version == REVLOGV2: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1738 self._parse_index = parse_index_v2 |
47277
921648d31553
changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47274
diff
changeset
|
1739 elif self._format_version == CHANGELOGV2: |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47280
diff
changeset
|
1740 self._parse_index = parse_index_cl_v2 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
1741 elif devel_nodemap: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
1742 self._parse_index = parse_index_v1_nodemap |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
1743 elif use_rust_index: |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
1744 self._parse_index = functools.partial( |
51275
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51274
diff
changeset
|
1745 parse_index_v1_rust, default_header=new_header |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
1746 ) |
13265
04b302ce2781
revlog: always add the magic nullid/nullrev entry in parseindex
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13264
diff
changeset
|
1747 try: |
47190
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
1748 d = self._parse_index(index_data, self._inline) |
47431
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47420
diff
changeset
|
1749 index, chunkcache = d |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1750 use_nodemap = ( |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1751 not self._inline |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1752 and self._nodemap_file is not None |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
1753 and hasattr(index, 'update_nodemap_data') |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1754 ) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1755 if use_nodemap: |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1756 nodemap_data = nodemaputil.persisted_data(self) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
1757 if nodemap_data is not None: |
44525
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1758 docket = nodemap_data[0] |
44803
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1759 if ( |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1760 len(d[0]) > docket.tip_rev |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1761 and d[0][docket.tip_rev][7] == docket.tip_node |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
1762 ): |
44525
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1763 # no changelog tampering |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1764 self._nodemap_docket = docket |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
1765 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
|
1766 except (ValueError, IndexError): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1767 raise error.RevlogError( |
47172
e1936ae27897
revlog: use revlog.display_id for corruption error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47171
diff
changeset
|
1768 _(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
|
1769 ) |
47431
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47420
diff
changeset
|
1770 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
|
1771 # revnum -> (chain-length, sum-delta-length) |
45802
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
1772 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
|
1773 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1774 return chunkcache |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1775 |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1776 def _load_inner(self, chunk_cache): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1777 if self._docket is None: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1778 default_compression_header = None |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1779 else: |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1780 default_compression_header = self._docket.default_compression_header |
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1781 |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1782 self._inner = _InnerRevlog( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1783 opener=self.opener, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1784 index=self.index, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1785 index_file=self._indexfile, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1786 data_file=self._datafile, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1787 sidedata_file=self._sidedatafile, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1788 inline=self._inline, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1789 data_config=self.data_config, |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
1790 delta_config=self.delta_config, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1791 feature_config=self.feature_config, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1792 chunk_cache=chunk_cache, |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
1793 default_compression_header=default_compression_header, |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
1794 ) |
116
e484cd5ec282
Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents:
115
diff
changeset
|
1795 |
50694
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1796 def get_revlog(self): |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1797 """simple function to mirror API of other not-really-revlog API""" |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1798 return self |
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50391
diff
changeset
|
1799 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
1800 @util.propertycache |
47090
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1801 def revlog_kind(self): |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1802 return self.target[0] |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1803 |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
1804 @util.propertycache |
47167
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
1805 def display_id(self): |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
1806 """The public facing "ID" of the revlog that we use in message""" |
49712
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1807 if self.revlog_kind == KIND_FILELOG: |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1808 # Reference the file without the "data/" prefix, so it is familiar |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1809 # to the user. |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1810 return self.target[1] |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1811 else: |
92892dff03f3
revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49711
diff
changeset
|
1812 return self.radix |
47167
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
1813 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1814 def _datafp(self, mode=b'r'): |
36006
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35885
diff
changeset
|
1815 """file object for the revlog's data file""" |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
1816 return self.opener(self._datafile, mode=mode) |
36006
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35885
diff
changeset
|
1817 |
43492
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1818 def tiprev(self): |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1819 return len(self.index) - 1 |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1820 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1821 def tip(self): |
43492
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
1822 return self.node(self.tiprev()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1823 |
24030
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
1824 def __contains__(self, rev): |
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
1825 return 0 <= rev < len(self) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1826 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1827 def __len__(self): |
38890
781b2720d2ac
index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38889
diff
changeset
|
1828 return len(self.index) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1829 |
51868
0338fb200a30
typing: lock in new pytype gains from making revlog related classes typeable
Matt Harbison <matt_harbison@yahoo.com>
parents:
51867
diff
changeset
|
1830 def __iter__(self) -> Iterator[int]: |
49292
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
49263
diff
changeset
|
1831 return iter(range(len(self))) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1832 |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
1833 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
|
1834 """iterate over all rev in this revlog (from start to stop)""" |
39886
d63153611ed5
storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39884
diff
changeset
|
1835 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
|
1836 |
16374
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1837 def hasnode(self, node): |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1838 try: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1839 self.rev(node) |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1840 return True |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1841 except KeyError: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1842 return False |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
1843 |
51009
39fa0b948f5a
revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51008
diff
changeset
|
1844 def _candelta(self, baserev, rev): |
35839
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1845 """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
|
1846 # 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
|
1847 # 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
|
1848 # 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
|
1849 # 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
|
1850 # rawtext contents) and the delta could be incompatible. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1851 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1852 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1853 ): |
35839
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1854 return False |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1855 return True |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
1856 |
44465
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
1857 def update_caches(self, transaction): |
51010
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
1858 """update on disk cache |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
1859 |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
1860 If a transaction is passed, the update may be delayed to transaction |
569eb5d0420d
revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51009
diff
changeset
|
1861 commit.""" |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1862 if self._nodemap_file is not None: |
44465
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
1863 if transaction is None: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
1864 nodemaputil.update_persistent_nodemap(self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
1865 else: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
1866 nodemaputil.setup_persistent_nodemap(transaction, self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
1867 |
16414
e8d37b78acfb
parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents:
16375
diff
changeset
|
1868 def clearcaches(self): |
51011
6c3798b4597f
revlog: document the `clearcaches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51010
diff
changeset
|
1869 """Clear in-memory caches""" |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1870 self._chainbasecache.clear() |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
1871 self._inner.clear_cache() |
27465
072a675c51f2
revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27449
diff
changeset
|
1872 self._pcache = {} |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1873 self._nodemap_docket = None |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
1874 self.index.clearcaches() |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1875 # The python code is the one responsible for validating the docket, we |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1876 # end up having to refresh it here. |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1877 use_nodemap = ( |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1878 not self._inline |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
1879 and self._nodemap_file is not None |
50951
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50761
diff
changeset
|
1880 and hasattr(self.index, 'update_nodemap_data') |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1881 ) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1882 if use_nodemap: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1883 nodemap_data = nodemaputil.persisted_data(self) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1884 if nodemap_data is not None: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1885 self._nodemap_docket = nodemap_data[0] |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
1886 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
|
1887 |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
1888 def rev(self, node): |
51012
ccddd2f54013
revlog: document the `rev` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51011
diff
changeset
|
1889 """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
|
1890 try: |
43601
2da51e292734
index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
1891 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
|
1892 except TypeError: |
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
21752
diff
changeset
|
1893 raise |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
1894 except error.RevlogError: |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
1895 # parsers.c radix tree lookup failed |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1896 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1897 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1898 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1899 ): |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
1900 raise error.WdirUnsupported |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
1901 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
|
1902 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1903 # Accessors for index entries. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1904 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1905 # 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
|
1906 # are flags. |
2072 | 1907 def start(self, rev): |
5006
c2febf5420e9
revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents:
5005
diff
changeset
|
1908 return int(self.index[rev][0] >> 16) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1909 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1910 def sidedata_cut_off(self, rev): |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1911 sd_cut_off = self.index[rev][8] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1912 if sd_cut_off != 0: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1913 return sd_cut_off |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1914 # This is some annoying dance, because entries without sidedata |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1915 # currently use 0 as their ofsset. (instead of previous-offset + |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1916 # previous-size) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1917 # |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1918 # We should reconsider this sidedata → 0 sidata_offset policy. |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1919 # In the meantime, we need this. |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1920 while 0 <= rev: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1921 e = self.index[rev] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1922 if e[9] != 0: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1923 return e[8] + e[9] |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1924 rev -= 1 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1925 return 0 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
1926 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1927 def flags(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1928 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
|
1929 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1930 def length(self, rev): |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1931 return self.index[rev][1] |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1932 |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1933 def sidedata_length(self, rev): |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
1934 if not self.feature_config.has_side_data: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1935 return 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1936 return self.index[rev][9] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1937 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1938 def rawsize(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1939 """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
|
1940 l = self.index[rev][2] |
38210
7fa3408f83ef
revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents:
38202
diff
changeset
|
1941 if l >= 0: |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1942 return l |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1943 |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
1944 t = self.rawdata(rev) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1945 return len(t) |
31856
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1946 |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1947 def size(self, rev): |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1948 """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
|
1949 # 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
|
1950 # 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
|
1951 flags = self.flags(rev) |
42747
92ac6b1697a7
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42746
diff
changeset
|
1952 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
|
1953 return self.rawsize(rev) |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
1954 |
48564
c514936d92b4
revlog: remove deprecated APIs
Raphaël Gomès <rgomes@octobus.net>
parents:
48287
diff
changeset
|
1955 return len(self.revision(rev)) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1956 |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1957 def fast_rank(self, rev): |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1958 """Return the rank of a revision if already known, or None otherwise. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1959 |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1960 The rank of a revision is the size of the sub-graph it defines as a |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1961 head. Equivalently, the rank of a revision `r` is the size of the set |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1962 `ancestors(r)`, `r` included. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1963 |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1964 This method returns the rank retrieved from the revlog in constant |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1965 time. It makes no attempt at computing unknown values for versions of |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1966 the revlog which do not persist the rank. |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1967 """ |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1968 rank = self.index[rev][ENTRY_RANK] |
48942
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48772
diff
changeset
|
1969 if self._format_version != CHANGELOGV2 or rank == RANK_UNKNOWN: |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1970 return None |
48942
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48772
diff
changeset
|
1971 if rev == nullrev: |
d739cd69bb6a
revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents:
48772
diff
changeset
|
1972 return 0 # convention |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1973 return rank |
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
1974 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
1975 def chainbase(self, rev): |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1976 base = self._chainbasecache.get(rev) |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1977 if base is not None: |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1978 return base |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1979 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
1980 index = self.index |
38202
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
1981 iterrev = rev |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
1982 base = index[iterrev][3] |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
1983 while base != iterrev: |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
1984 iterrev = base |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
1985 base = index[iterrev][3] |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1986 |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
1987 self._chainbasecache[rev] = base |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
1988 return base |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1989 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1990 def linkrev(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1991 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
|
1992 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
1993 def parentrevs(self, rev): |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
1994 try: |
35525
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35354
diff
changeset
|
1995 entry = self.index[rev] |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
1996 except IndexError: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
1997 if rev == wdirrev: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
1998 raise error.WdirUnsupported |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
1999 raise |
47052
411dc27fd9fd
corruption: backout changeset 49fd21f32695 (issue6528)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
2000 |
51070
14574a41a7a7
revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51069
diff
changeset
|
2001 if self.feature_config.canonical_parent_order and entry[5] == nullrev: |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2002 return entry[6], entry[5] |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2003 else: |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2004 return entry[5], entry[6] |
35525
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35354
diff
changeset
|
2005 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2006 # fast parentrevs(rev) where rev isn't filtered |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2007 _uncheckedparentrevs = parentrevs |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2008 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2009 def node(self, rev): |
32481
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2010 try: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2011 return self.index[rev][7] |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2012 except IndexError: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2013 if rev == wdirrev: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2014 raise error.WdirUnsupported |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
2015 raise |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2016 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2017 # Derived from index values. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2018 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2019 def end(self, rev): |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2020 return self.start(rev) + self.length(rev) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2021 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2022 def parents(self, node): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2023 i = self.index |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2024 d = i[self.rev(node)] |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2025 # inline node() to avoid function call overhead |
51070
14574a41a7a7
revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51069
diff
changeset
|
2026 if self.feature_config.canonical_parent_order and d[5] == self.nullid: |
49077
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2027 return i[d[6]][7], i[d[5]][7] |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2028 else: |
5b65721a75eb
revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents:
49037
diff
changeset
|
2029 return i[d[5]][7], i[d[6]][7] |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
2030 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2031 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
|
2032 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
|
2033 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2034 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
|
2035 chaininfocache = self._chaininfocache |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2036 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
|
2037 return chaininfocache[rev] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2038 index = self.index |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
2039 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
|
2040 iterrev = rev |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2041 e = index[iterrev] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2042 clen = 0 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2043 compresseddeltalen = 0 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2044 while iterrev != e[3]: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2045 clen += 1 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
2046 compresseddeltalen += e[1] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2047 if generaldelta: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2048 iterrev = e[3] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2049 else: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2050 iterrev -= 1 |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2051 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
|
2052 t = chaininfocache[iterrev] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2053 clen += t[0] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2054 compresseddeltalen += t[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2055 break |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
2056 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
|
2057 else: |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2058 # 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
|
2059 # 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
|
2060 compresseddeltalen += e[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2061 r = (clen, compresseddeltalen) |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2062 chaininfocache[rev] = r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2063 return r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
2064 |
27468
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
2065 def _deltachain(self, rev, stoprev=None): |
51099
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
2066 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
|
2067 |
18081
f88c60e740a1
revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents:
17975
diff
changeset
|
2068 def ancestors(self, revs, stoprev=0, inclusive=False): |
40772
8947f49daaa8
revlog: update the docstring of `ancestors` to match reality
Boris Feld <boris.feld@octobus.net>
parents:
40671
diff
changeset
|
2069 """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
|
2070 Does not generate revs lower than stoprev. |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2071 |
18090
9abc55ef85b5
revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents:
18083
diff
changeset
|
2072 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
|
2073 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2074 # first, make sure start revisions aren't filtered |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2075 revs = list(revs) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2076 checkrev = self.node |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2077 for r in revs: |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2078 checkrev(r) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
2079 # and we're sure ancestors aren't filtered as well |
41118
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2080 |
47280
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47277
diff
changeset
|
2081 if rustancestor is not None and self.index.rust_ext_compat: |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
2082 lazyancestors = rustancestor.LazyAncestors |
41118
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2083 arg = self.index |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2084 else: |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2085 lazyancestors = ancestor.lazyancestors |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2086 arg = self._uncheckedparentrevs |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
2087 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
|
2088 |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16866
diff
changeset
|
2089 def descendants(self, revs): |
40000
0b24fcd88066
dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39913
diff
changeset
|
2090 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
|
2091 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2092 def findcommonmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2093 """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
|
2094 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
|
2095 tuple: |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2096 |
15835
fa15869bf95c
revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15827
diff
changeset
|
2097 ::common, (::heads) - (::common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2098 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2099 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
|
2100 topologically sorted. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2101 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2102 '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
|
2103 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
|
2104 supplied, uses nullid.""" |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2105 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2106 common = [self.nullid] |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2107 if heads is None: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2108 heads = self.heads() |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2109 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2110 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
|
2111 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
|
2112 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2113 # we want the ancestors, but inclusive |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49019
diff
changeset
|
2114 class lazyset: |
20073
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2115 def __init__(self, lazyvalues): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2116 self.addedvalues = set() |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2117 self.lazyvalues = lazyvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2118 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2119 def __contains__(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2120 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
|
2121 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2122 def __iter__(self): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2123 added = self.addedvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2124 for r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2125 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2126 for r in self.lazyvalues: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2127 if not r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2128 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2129 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2130 def add(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2131 self.addedvalues.add(value) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2132 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2133 def update(self, values): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2134 self.addedvalues.update(values) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2135 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
2136 has = lazyset(self.ancestors(common)) |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2137 has.add(nullrev) |
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2138 has.update(common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2139 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2140 # 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
|
2141 missing = set() |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
2142 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
|
2143 while visit: |
16803
107a3270a24a
cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents:
16786
diff
changeset
|
2144 r = visit.popleft() |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2145 if r in missing: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2146 continue |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2147 else: |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2148 missing.add(r) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2149 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
|
2150 if p not in has: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2151 visit.append(p) |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
2152 missing = list(missing) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
2153 missing.sort() |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2154 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
|
2155 |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2156 def incrementalmissingrevs(self, common=None): |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2157 """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
|
2158 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
|
2159 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
|
2160 object. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2161 |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2162 '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
|
2163 nullrev. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2164 """ |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2165 if common is None: |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2166 common = [nullrev] |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
2167 |
47280
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47277
diff
changeset
|
2168 if rustancestor is not None and self.index.rust_ext_compat: |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
2169 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
|
2170 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
|
2171 |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2172 def findmissingrevs(self, common=None, heads=None): |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2173 """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
|
2174 are not ancestors of common. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2175 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2176 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
|
2177 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
|
2178 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2179 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
|
2180 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
|
2181 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2182 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
|
2183 topologically sorted. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2184 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2185 '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
|
2186 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
|
2187 supplied, uses nullid.""" |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2188 if common is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2189 common = [nullrev] |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2190 if heads is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2191 heads = self.headrevs() |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2192 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2193 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2194 return inc.missingancestors(heads) |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
2195 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2196 def findmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2197 """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
|
2198 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2199 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
|
2200 satisfies the following constraints: |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2201 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2202 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
|
2203 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
|
2204 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2205 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
|
2206 topologically sorted. |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2207 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
2208 '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
|
2209 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
|
2210 supplied, uses nullid.""" |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2211 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2212 common = [self.nullid] |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2213 if heads is None: |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2214 heads = self.heads() |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2215 |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
2216 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
|
2217 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
|
2218 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2219 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
2220 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
|
2221 |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2222 def nodesbetween(self, roots=None, heads=None): |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2223 """Return a topological path from 'roots' to 'heads'. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2224 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2225 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
|
2226 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
|
2227 these constraints: |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2228 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2229 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
|
2230 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
|
2231 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2232 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
|
2233 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
|
2234 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
|
2235 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2236 '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
|
2237 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
|
2238 '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
|
2239 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
2240 '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
|
2241 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
|
2242 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
|
2243 nonodes = ([], [], []) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2244 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
|
2245 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
|
2246 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
|
2247 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2248 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
|
2249 else: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2250 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
|
2251 lowestrev = nullrev |
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
2252 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
|
2253 # We want _all_ the nodes! |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2254 return ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2255 [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
|
2256 [self.nullid], |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2257 list(self.heads()), |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2258 ) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2259 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
|
2260 # 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
|
2261 # node. |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2262 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
|
2263 # 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
|
2264 ancestors = None |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2265 # 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
|
2266 heads = {} |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2267 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
|
2268 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
|
2269 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
|
2270 return nonodes |
8464
7af92e70bb25
revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8453
diff
changeset
|
2271 ancestors = set() |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2272 # 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
|
2273 # 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
|
2274 # find from roots. |
14219
c33427080671
revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
2275 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
|
2276 # 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
|
2277 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
|
2278 # 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
|
2279 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
|
2280 while nodestotag: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2281 # 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
|
2282 n = nodestotag.pop() |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2283 # Never tag nullid |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2284 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
|
2285 continue |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2286 # 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
|
2287 # 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
|
2288 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
|
2289 if r >= lowestrev: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2290 if n not in ancestors: |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2291 # 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
|
2292 # 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
|
2293 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
|
2294 # 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
|
2295 nodestotag.update( |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2296 [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
|
2297 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2298 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
|
2299 # 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
|
2300 # any other heads. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2301 heads.pop(n) |
1459
106fdec8e1fb
Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
2302 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
|
2303 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2304 # 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
|
2305 # 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
|
2306 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2307 # 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
|
2308 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
|
2309 # 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
|
2310 # 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
|
2311 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2312 # Filter out roots that aren't ancestors of heads |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2313 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
|
2314 # 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
|
2315 if roots: |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2316 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
|
2317 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2318 # 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
|
2319 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2320 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2321 # 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
|
2322 # 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
|
2323 lowestrev = nullrev |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2324 roots = [self.nullid] |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
2325 # Transform our roots list into a set. |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2326 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
|
2327 # 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
|
2328 # '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
|
2329 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
|
2330 # 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
|
2331 orderedout = [] |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2332 # Don't start at nullid since we don't want nullid in our output list, |
17483 | 2333 # 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
|
2334 # 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
|
2335 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
|
2336 n = self.node(r) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2337 isdescendant = False |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2338 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
|
2339 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2340 elif n in descendants: |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2341 # n is already a descendant |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2342 isdescendant = True |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2343 # 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
|
2344 # 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
|
2345 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
|
2346 # 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
|
2347 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2348 # 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
|
2349 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
|
2350 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
|
2351 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2352 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2353 # 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
|
2354 # 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
|
2355 # up there, remember?) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2356 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
|
2357 descendants.add(n) |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2358 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
2359 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
|
2360 # 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
|
2361 orderedout.append(n) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2362 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
|
2363 # 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
|
2364 # from roots. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2365 # 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
|
2366 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
|
2367 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
|
2368 # 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
|
2369 # 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
|
2370 # 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
|
2371 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
|
2372 # 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
|
2373 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
|
2374 heads.pop(p, None) |
49004
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
2375 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
|
2376 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
|
2377 assert orderedout |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2378 assert roots |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2379 assert heads |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
2380 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
|
2381 |
41275
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2382 def headrevs(self, revs=None): |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2383 if revs is None: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2384 try: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2385 return self.index.headrevs() |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2386 except AttributeError: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
2387 return self._headrevs() |
47280
6be2a7ca4b1d
revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47277
diff
changeset
|
2388 if rustdagop is not None and self.index.rust_ext_compat: |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
2389 return rustdagop.headrevs(self.index, revs) |
41772
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41700
diff
changeset
|
2390 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
|
2391 |
51394
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2392 def headrevsdiff(self, start, stop): |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2393 try: |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2394 return self.index.headrevsdiff(start, stop) |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2395 except AttributeError: |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2396 return dagop.headrevsdiff(self._uncheckedparentrevs, start, stop) |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2397 |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
2398 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
|
2399 return self.index.computephasesmapsets(roots) |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
2400 |
17674
e69274f8d444
clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17673
diff
changeset
|
2401 def _headrevs(self): |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2402 count = len(self) |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2403 if not count: |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2404 return [nullrev] |
17673
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
2405 # 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
|
2406 ishead = [0] * (count + 1) |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
2407 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
|
2408 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
|
2409 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
|
2410 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
|
2411 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
|
2412 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
|
2413 |
51283
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2414 def _head_node_ids(self): |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2415 try: |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2416 return self.index.head_node_ids() |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2417 except AttributeError: |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2418 return [self.node(r) for r in self.headrevs()] |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2419 |
3923
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3755
diff
changeset
|
2420 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
|
2421 """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
|
2422 |
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2423 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
|
2424 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
|
2425 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
|
2426 as if they had no children |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2427 """ |
4991
9c8c42bcf17a
revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents:
4990
diff
changeset
|
2428 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
|
2429 if not len(self): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2430 return [self.nullid] |
51283
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51275
diff
changeset
|
2431 return self._head_node_ids() |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
2432 if start is None: |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2433 start = nullrev |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2434 else: |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2435 start = self.rev(start) |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2436 |
44470
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44465
diff
changeset
|
2437 stoprevs = {self.rev(n) for n in stop or []} |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2438 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2439 revs = dagop.headrevssubset( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2440 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2441 ) |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2442 |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
2443 return [self.node(rev) for rev in revs] |
370 | 2444 |
51394
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2445 def diffheads(self, start, stop): |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2446 """return the nodes that make up the difference between |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2447 heads of revs before `start` and heads of revs before `stop`""" |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2448 removed, added = self.headrevsdiff(start, stop) |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2449 return [self.node(r) for r in removed], [self.node(r) for r in added] |
a0d88b021a98
unbundle: faster computation of changed heads
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51328
diff
changeset
|
2450 |
370 | 2451 def children(self, node): |
1083 | 2452 """find the children of a given node""" |
370 | 2453 c = [] |
2454 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
|
2455 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
|
2456 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
|
2457 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
|
2458 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
|
2459 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
|
2460 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
|
2461 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
|
2462 c.append(self.node(r)) |
370 | 2463 return c |
515 | 2464 |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2465 def commonancestorsheads(self, a, b): |
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2466 """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
|
2467 a, b = self.rev(a), self.rev(b) |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2468 ancs = self._commonancestorsheads(a, b) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2469 return pycompat.maplist(self.node, ancs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2470 |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2471 def _commonancestorsheads(self, *revs): |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2472 """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
|
2473 try: |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2474 ancs = self.index.commonancestorsheads(*revs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2475 except (AttributeError, OverflowError): # C implementation failed |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2476 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
2477 return ancs |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
2478 |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
2479 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
|
2480 """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
|
2481 |
160da69ba1bf
revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38663
diff
changeset
|
2482 A revision is considered an ancestor of itself.""" |
38518
cc3543c87de5
revlog: reuse 'descendant' implemention in 'isancestor'
Boris Feld <boris.feld@octobus.net>
parents:
38517
diff
changeset
|
2483 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
|
2484 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
|
2485 |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
2486 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
|
2487 """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
|
2488 |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2489 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
|
2490 |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2491 The implementation of this is trivial but the use of |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2492 reachableroots is not.""" |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2493 if a == nullrev: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2494 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2495 elif a == b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2496 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2497 elif a > b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
2498 return False |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2499 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
|
2500 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2501 def reachableroots(self, minroot, heads, roots, includepath=False): |
43799
2e30d7df4809
revlog: fix revset in reachableroots docstring
Jun Wu <quark@fb.com>
parents:
43663
diff
changeset
|
2502 """return (heads(::(<roots> and <roots>::<heads>))) |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2503 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2504 If includepath is True, return (<roots>::<heads>).""" |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2505 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2506 return self.index.reachableroots2( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2507 minroot, heads, roots, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2508 ) |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
2509 except AttributeError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2510 return dagop._reachablerootspure( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2511 self.parentrevs, minroot, roots, heads, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2512 ) |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
2513 |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2514 def ancestor(self, a, b): |
22389
94f77624dbb5
comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents:
22381
diff
changeset
|
2515 """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
|
2516 |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
2517 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
|
2518 try: |
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2519 ancs = self.index.ancestors(a, b) |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2520 except (AttributeError, OverflowError): |
18988
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
2521 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
|
2522 if ancs: |
3605d4e7e618
revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents:
18986
diff
changeset
|
2523 # choose a consistent winner when there's a tie |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
2524 return min(map(self.node, ancs)) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2525 return self.nullid |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
2526 |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2527 def _match(self, id): |
16762
93f8b9565257
revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents:
16686
diff
changeset
|
2528 if isinstance(id, int): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2529 # 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
|
2530 return self.node(id) |
47082
c5e1cc0b4c77
core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents:
47081
diff
changeset
|
2531 if len(id) == self.nodeconstants.nodelen: |
3438 | 2532 # possibly a binary node |
2533 # odds of a binary node being all hex in ASCII are 1 in 10**25 | |
2534 try: | |
2535 node = id | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2536 self.rev(node) # quick search the index |
3438 | 2537 return node |
39791
974592474dee
revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39790
diff
changeset
|
2538 except error.LookupError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2539 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
|
2540 try: |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2541 # str(rev) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2542 rev = int(id) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2543 if b"%d" % rev != id: |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2544 raise ValueError |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2545 if rev < 0: |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2546 rev = len(self) + rev |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2547 if rev < 0 or rev >= len(self): |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
2548 raise ValueError |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
2549 return self.node(rev) |
469 | 2550 except (ValueError, OverflowError): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
2551 pass |
47081
a407fe56d6e8
core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents:
47079
diff
changeset
|
2552 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
|
2553 try: |
3438 | 2554 # a full hex nodeid? |
2555 node = bin(id) | |
7874
d812029cda85
cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7873
diff
changeset
|
2556 self.rev(node) |
3157
4fe41a9e4591
optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3156
diff
changeset
|
2557 return node |
49263
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
49262
diff
changeset
|
2558 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
|
2559 pass |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2560 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2561 def _partialmatch(self, id): |
37449
a0d71618074f
revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents:
37443
diff
changeset
|
2562 # we don't care wdirfilenodeids as they should be always full hash |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2563 maybewdir = self.nodeconstants.wdirhex.startswith(id) |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2564 ambiguous = False |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2565 try: |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2566 partial = self.index.partialmatch(id) |
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
2567 if partial and self.hasnode(partial): |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2568 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2569 # single 'ff...' match in radix tree, ambiguous with wdir |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2570 ambiguous = True |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2571 else: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2572 return partial |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2573 elif maybewdir: |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2574 # no 'ff...' match in radix tree, wdir identified |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2575 raise error.WdirUnsupported |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2576 else: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2577 return None |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2578 except error.RevlogError: |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2579 # 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
|
2580 # 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
|
2581 if not getattr(self, 'filteredrevs', None): |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2582 ambiguous = True |
19471
fd1bb7c1be78
revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents:
19326
diff
changeset
|
2583 # 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
|
2584 except (AttributeError, ValueError): |
49448
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2585 # 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
|
2586 pass |
47305
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2587 if ambiguous: |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2588 raise error.AmbiguousPrefixLookupError( |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2589 id, self.display_id, _(b'ambiguous identifier') |
93a0abe098e7
revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents:
47296
diff
changeset
|
2590 ) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
2591 |
13258
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2592 if id in self._pcache: |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2593 return self._pcache[id] |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
2594 |
37819
ee3d58b4a47f
revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents:
37767
diff
changeset
|
2595 if len(id) <= 40: |
49262
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2596 # hex(node)[:...] |
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2597 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
|
2598 try: |
49448
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2599 # we're dropping the last digit, so let's check that it's hex, |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2600 # to avoid the expensive computation below if it's not |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2601 if len(id) % 2 > 0: |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2602 if not (id[-1] in hexdigits): |
5fe7e9eda0f3
revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49314
diff
changeset
|
2603 return None |
49261
31602d471b60
revlog: make round-down pattern clearer
Manuel Jacob <me@manueljacob.de>
parents:
49248
diff
changeset
|
2604 prefix = bin(id[:l]) |
49263
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
49262
diff
changeset
|
2605 except binascii.Error: |
49262
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2606 pass |
3e5f1fb2aec7
revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents:
49261
diff
changeset
|
2607 else: |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
2608 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
|
2609 nl = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2610 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
|
2611 ] |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2612 if self.nodeconstants.nullhex.startswith(id): |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2613 nl.append(self.nullid) |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2614 if len(nl) > 0: |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2615 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
|
2616 self._pcache[id] = nl[0] |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2617 return nl[0] |
39790
4a2466b2a434
revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39789
diff
changeset
|
2618 raise error.AmbiguousPrefixLookupError( |
47173
1ec64f59dc27
revlog: use revlog.display_id in ambiguity errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47172
diff
changeset
|
2619 id, self.display_id, _(b'ambiguous identifier') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2620 ) |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2621 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
2622 raise error.WdirUnsupported |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
2623 return None |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2624 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2625 def lookup(self, id): |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2626 """locate a node based on: |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2627 - revision number or str(revision number) |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2628 - 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
|
2629 """ |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2630 n = self._match(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2631 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
|
2632 return n |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2633 n = self._partialmatch(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2634 if n: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
2635 return n |
515 | 2636 |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2637 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
|
2638 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2639 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
|
2640 """Find the shortest unambiguous prefix that matches node.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2641 |
37907
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
2642 def isvalid(prefix): |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2643 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
|
2644 matchednode = self._partialmatch(prefix) |
39836
7a9e2d85f475
revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents:
39794
diff
changeset
|
2645 except error.AmbiguousPrefixLookupError: |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2646 return False |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2647 except error.WdirUnsupported: |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2648 # single 'ff...' match |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2649 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
|
2650 if matchednode is None: |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2651 raise error.LookupError(node, self.display_id, _(b'no node')) |
38014
76e933e0ccc9
shortest: remove unnecessary check for revnum in isvalid()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38013
diff
changeset
|
2652 return True |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2653 |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2654 def maybewdir(prefix): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2655 return all(c == b'f' for c in pycompat.iterbytestr(prefix)) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2656 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
2657 hexnode = hex(node) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2658 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2659 def disambiguate(hexnode, minlength): |
38015
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
38014
diff
changeset
|
2660 """Disambiguate against wdirid.""" |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
2661 for length in range(minlength, len(hexnode) + 1): |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2662 prefix = hexnode[:length] |
38015
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
38014
diff
changeset
|
2663 if not maybewdir(prefix): |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2664 return prefix |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2665 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2666 if not getattr(self, 'filteredrevs', None): |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2667 try: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2668 length = max(self.index.shortest(node), minlength) |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2669 return disambiguate(hexnode, length) |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2670 except error.RevlogError: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2671 if node != self.nodeconstants.wdirid: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2672 raise error.LookupError( |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
2673 node, self.display_id, _(b'no node') |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2674 ) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2675 except AttributeError: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2676 # Fall through to pure code |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2677 pass |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
2678 |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2679 if node == self.nodeconstants.wdirid: |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
2680 for length in range(minlength, len(hexnode) + 1): |
38013
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2681 prefix = hexnode[:length] |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2682 if isvalid(prefix): |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2683 return prefix |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2684 |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
2685 for length in range(minlength, len(hexnode) + 1): |
37907
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
2686 prefix = hexnode[:length] |
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
2687 if isvalid(prefix): |
38013
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
2688 return disambiguate(hexnode, length) |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
2689 |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2690 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
|
2691 """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
|
2692 |
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
2693 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
|
2694 """ |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
2695 p1, p2 = self.parents(node) |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
2696 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
|
2697 |
11929
1839a7518b0d
revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
11928
diff
changeset
|
2698 def deltaparent(self, rev): |
14195
0013d3eeb826
revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents:
14164
diff
changeset
|
2699 """return deltaparent of the given revision""" |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2700 base = self.index[rev][3] |
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2701 if base == rev: |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2702 return nullrev |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
2703 elif self.delta_config.general_delta: |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
2704 return base |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2705 else: |
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2706 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
|
2707 |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
2708 def issnapshot(self, rev): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2709 """tells whether rev is a snapshot""" |
51097
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
2710 ret = self._inner.issnapshot(rev) |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
2711 self.issnapshot = self._inner.issnapshot |
ff673b9da21f
revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51096
diff
changeset
|
2712 return ret |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
2713 |
39185
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2714 def snapshotdepth(self, rev): |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2715 """number of snapshot in the chain before this one""" |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2716 if not self.issnapshot(rev): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2717 raise error.ProgrammingError(b'revision %d not a snapshot') |
51099
30f458fc59e9
revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51098
diff
changeset
|
2718 return len(self._inner._deltachain(rev)[0]) - 1 |
39185
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
2719 |
1941
7518823709a2
revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1853
diff
changeset
|
2720 def revdiff(self, rev1, rev2): |
31758
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2721 """return or calculate a delta between two revisions |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2722 |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2723 The delta calculated is in binary form and is intended to be written to |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2724 revlog data directly. So this function needs raw revision data. |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
2725 """ |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
2726 if rev1 != nullrev and self.deltaparent(rev2) == rev1: |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
2727 return bytes(self._inner._chunk(rev2)) |
5005
72082bfced9a
revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents:
5004
diff
changeset
|
2728 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2729 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
|
2730 |
51027
33d2f0164d0d
revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51025
diff
changeset
|
2731 def revision(self, nodeorrev): |
16435
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2732 """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
|
2733 number. |
df347129305d
revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents:
16424
diff
changeset
|
2734 """ |
51027
33d2f0164d0d
revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51025
diff
changeset
|
2735 return self._revisiondata(nodeorrev) |
42735
389233789952
revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42711
diff
changeset
|
2736 |
51029
299b7b5440db
revlog: drop the df argument to `sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51028
diff
changeset
|
2737 def sidedata(self, nodeorrev): |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2738 """a map of extra data related to the changeset but not part of the hash |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2739 |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2740 This function currently return a dictionary. However, more advanced |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2741 mapping object will likely be used in the future for a more |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2742 efficient/lazy code. |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2743 """ |
47388
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2744 # deal with <nodeorrev> argument type |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2745 if isinstance(nodeorrev, int): |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2746 rev = nodeorrev |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2747 else: |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2748 rev = self.rev(nodeorrev) |
d6a52783d2ba
revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47336
diff
changeset
|
2749 return self._sidedata(rev) |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
2750 |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2751 def _rawtext(self, node, rev): |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2752 """return the possibly unvalidated rawtext for a revision |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2753 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2754 returns (rev, rawtext, validated) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2755 """ |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2756 # Check if we have the entry in cache |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2757 # The cache entry looks like (node, rev, rawtext) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2758 if self._inner._revisioncache: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2759 if self._inner._revisioncache[0] == node: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2760 return (rev, self._inner._revisioncache[2], True) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2761 |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2762 if rev is None: |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2763 rev = self.rev(node) |
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2764 |
51894
384016e91947
revlog: simplify rawtext return value
Raphaël Gomès <rgomes@octobus.net>
parents:
51893
diff
changeset
|
2765 text = self._inner.raw_text(node, rev) |
384016e91947
revlog: simplify rawtext return value
Raphaël Gomès <rgomes@octobus.net>
parents:
51893
diff
changeset
|
2766 return (rev, text, False) |
51101
be56d322ee89
revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51100
diff
changeset
|
2767 |
51031
8520db304f01
revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51030
diff
changeset
|
2768 def _revisiondata(self, nodeorrev, raw=False): |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
2769 # deal with <nodeorrev> argument type |
16375
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2770 if isinstance(nodeorrev, int): |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2771 rev = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2772 node = self.node(rev) |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2773 else: |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2774 node = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2775 rev = None |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
2776 |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
2777 # fast path the special `nullid` rev |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2778 if node == self.nullid: |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2779 return b"" |
42805
bf070a59546a
revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42804
diff
changeset
|
2780 |
43984
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43962
diff
changeset
|
2781 # ``rawtext`` is the text as stored inside the revlog. Might be the |
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43962
diff
changeset
|
2782 # revision or might need to be processed to retrieve the revision. |
51031
8520db304f01
revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51030
diff
changeset
|
2783 rev, rawtext, validated = self._rawtext(node, rev) |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2784 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2785 if raw and validated: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2786 # if we don't want to process the raw text and that raw |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2787 # text is cached, we can exit early. |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2788 return rawtext |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2789 if rev is None: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2790 rev = self.rev(node) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2791 # the revlog's flag for this revision |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2792 # (usually alter its state or content) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2793 flags = self.flags(rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2794 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2795 if validated and flags == REVIDX_DEFAULT_FLAGS: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2796 # no extra flags set, no flag processor runs, text = rawtext |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2797 return rawtext |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2798 |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
2799 if raw: |
42994
dff95420480f
flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42993
diff
changeset
|
2800 validatehash = flagutil.processflagsraw(self, rawtext, flags) |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
2801 text = rawtext |
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
2802 else: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2803 r = flagutil.processflagsread(self, rawtext, flags) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2804 text, validatehash = r |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2805 if validatehash: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2806 self.checkhash(text, node, rev=rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2807 if not validated: |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2808 self._inner._revisioncache = (node, rev, rawtext) |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2809 |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
2810 return text |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
2811 |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2812 def _sidedata(self, rev): |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2813 """Return the sidedata for a given revision number.""" |
51895
b04011ca6eff
revlog: add an early return for getting sidedata
Raphaël Gomès <rgomes@octobus.net>
parents:
51894
diff
changeset
|
2814 if self._sidedatafile is None: |
b04011ca6eff
revlog: add an early return for getting sidedata
Raphaël Gomès <rgomes@octobus.net>
parents:
51894
diff
changeset
|
2815 return {} |
51102
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2816 sidedata_end = None |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2817 if self._docket is not None: |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2818 sidedata_end = self._docket.sidedata_end |
49d75cc12b8f
revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51101
diff
changeset
|
2819 return self._inner.sidedata(rev, sidedata_end) |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2820 |
51028
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
2821 def rawdata(self, nodeorrev): |
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
2822 """return an uncompressed raw data of a given node or revision number.""" |
14de15825253
revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51027
diff
changeset
|
2823 return self._revisiondata(nodeorrev, raw=True) |
42736
415e4136d326
rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42735
diff
changeset
|
2824 |
22785
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2825 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
|
2826 """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
|
2827 |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2828 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
|
2829 as needed. |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
2830 """ |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
2831 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
|
2832 |
30589
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2833 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2834 """Check node hash integrity. |
19624
55749cb14d24
revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents:
19471
diff
changeset
|
2835 |
30589
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2836 Available as a function so that subclasses can extend hash mismatch |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2837 behaviors as needed. |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
2838 """ |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2839 try: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2840 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
|
2841 p1, p2 = self.parents(node) |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2842 if node != self.hash(text, p1, p2): |
40055
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2843 # Clear the revision cache on hash failure. The revision cache |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2844 # only stores the raw revision and clearing the cache does have |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2845 # the side-effect that we won't have a cache hit when the raw |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2846 # revision data is accessed. But this case should be rare and |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2847 # it is extra work to teach the cache about the hash |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2848 # verification state. |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2849 if ( |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2850 self._inner._revisioncache |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2851 and self._inner._revisioncache[0] == node |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2852 ): |
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
2853 self._inner._revisioncache = None |
40055
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
2854 |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2855 revornode = rev |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2856 if revornode is None: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2857 revornode = templatefilters.short(hex(node)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2858 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2859 _(b"integrity check failed on %s:%s") |
47174
0a66eef0ed97
revlog: use revlog.display_id in integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47173
diff
changeset
|
2860 % (self.display_id, pycompat.bytestr(revornode)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2861 ) |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2862 except error.RevlogError: |
51055
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
2863 if self.feature_config.censorable and storageutil.iscensoredtext( |
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
2864 text |
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
2865 ): |
47175
f574734eb2b7
revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
2866 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
|
2867 raise |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2868 |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2869 @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
|
2870 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
|
2871 """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
|
2872 |
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
|
2873 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
|
2874 it is always expected at the same location.""" |
50761
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
2875 parts = self.radix.split(b'/') |
50391
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2876 if len(parts) > 1: |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2877 # adds a '-s' prefix to the ``data/` or `meta/` base |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2878 head = parts[0] + b'-s' |
50761
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
2879 mids = parts[1:-1] |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
2880 tail = parts[-1] + b'.i' |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
2881 pieces = [head] + mids + [tail] |
4a3a9d961561
revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50694
diff
changeset
|
2882 return b'/'.join(pieces) |
50391
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2883 else: |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2884 # the revlog is stored at the root of the store (changelog or |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2885 # manifest), no risk of collision. |
12f13b13f414
revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50390
diff
changeset
|
2886 return self.radix + b'.i.s' |
50390
978ffa09910b
revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50348
diff
changeset
|
2887 |
51327
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2888 def _enforceinlinesize(self, tr): |
26376
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2889 """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
|
2890 |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2891 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
|
2892 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
|
2893 to use multiple index and data files. |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2894 """ |
38883
119d14f41cb2
revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents:
38880
diff
changeset
|
2895 tiprev = len(self) - 1 |
47181
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47180
diff
changeset
|
2896 total_size = self.start(tiprev) + self.length(tiprev) |
51203
a93e52f0b6ff
changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51202
diff
changeset
|
2897 if not self._inline or (self._may_inline and total_size < _maxinline): |
2073 | 2898 return |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2899 |
51092
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
2900 if self._docket is not None: |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
2901 msg = b"inline revlog should not have a docket" |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
2902 raise error.ProgrammingError(msg) |
31f143448704
revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51091
diff
changeset
|
2903 |
51202
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51143
diff
changeset
|
2904 # 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:
51143
diff
changeset
|
2905 # 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:
51143
diff
changeset
|
2906 # recorded in the transaction. |
51109
af96fbb8f739
revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51106
diff
changeset
|
2907 troffset = tr.findoffset(self._inner.canonical_index_file) |
51202
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51143
diff
changeset
|
2908 pre_touched = troffset is not None |
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51143
diff
changeset
|
2909 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
|
2910 raise error.RevlogError( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2911 _(b"%s not found in the transaction") % self._indexfile |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2912 ) |
51202
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51143
diff
changeset
|
2913 |
dcaa2df1f688
changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51143
diff
changeset
|
2914 tr.addbackup(self._inner.canonical_index_file, for_offset=pre_touched) |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2915 tr.add(self._datafile, 0) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2916 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2917 new_index_file_path = None |
51327
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2918 old_index_file_path = self._indexfile |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2919 new_index_file_path = self._split_index_file |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2920 opener = self.opener |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2921 weak_self = weakref.ref(self) |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2922 |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2923 # the "split" index replace the real index when the transaction is |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2924 # finalized |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2925 def finalize_callback(tr): |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2926 opener.rename( |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2927 new_index_file_path, |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2928 old_index_file_path, |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2929 checkambig=True, |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2930 ) |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2931 maybe_self = weak_self() |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2932 if maybe_self is not None: |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2933 maybe_self._indexfile = old_index_file_path |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2934 maybe_self._inner.index_file = maybe_self._indexfile |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2935 |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2936 def abort_callback(tr): |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2937 maybe_self = weak_self() |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2938 if maybe_self is not None: |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2939 maybe_self._indexfile = old_index_file_path |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2940 maybe_self._inner.inline = True |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2941 maybe_self._inner.index_file = old_index_file_path |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2942 |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2943 tr.registertmp(new_index_file_path) |
51505
3cf9e52f5e27
inline-changelog: fix a critical bug in write_pending that delete data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51426
diff
changeset
|
2944 # we use 001 here to make this this happens after the finalisation of |
3cf9e52f5e27
inline-changelog: fix a critical bug in write_pending that delete data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51426
diff
changeset
|
2945 # pending changelog write (using 000). Otherwise the two finalizer |
3cf9e52f5e27
inline-changelog: fix a critical bug in write_pending that delete data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51426
diff
changeset
|
2946 # would step over each other and delete the changelog.i file. |
51327
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2947 if self.target[1] is not None: |
51505
3cf9e52f5e27
inline-changelog: fix a critical bug in write_pending that delete data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51426
diff
changeset
|
2948 callback_id = b'001-revlog-split-%d-%s' % self.target |
51327
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2949 else: |
51505
3cf9e52f5e27
inline-changelog: fix a critical bug in write_pending that delete data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51426
diff
changeset
|
2950 callback_id = b'001-revlog-split-%d' % self.target[0] |
51327
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2951 tr.addfinalize(callback_id, finalize_callback) |
5b3b6db49bbb
changelog: drop the side_write argument to revlog splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51290
diff
changeset
|
2952 tr.addabort(callback_id, abort_callback) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2953 |
51094
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2954 self._format_flags &= ~FLAG_INLINE_DATA |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2955 self._inner.split_inline( |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2956 tr, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2957 self._format_flags | self._format_version, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2958 new_index_file_path=new_index_file_path, |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2959 ) |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2960 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2961 self._inline = False |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2962 if new_index_file_path is not None: |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2963 self._indexfile = new_index_file_path |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2964 |
de6a8cc24de3
revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51093
diff
changeset
|
2965 nodemaputil.setup_persistent_nodemap(tr, self) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2966 |
39891
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39886
diff
changeset
|
2967 def _nodeduplicatecallback(self, transaction, node): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2968 """called when trying to add a node already stored.""" |
39891
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39886
diff
changeset
|
2969 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2970 @contextlib.contextmanager |
47469
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47463
diff
changeset
|
2971 def reading(self): |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2972 with self._inner.reading(): |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2973 yield |
47469
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47463
diff
changeset
|
2974 |
5fa083a5ff04
copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents:
47463
diff
changeset
|
2975 @contextlib.contextmanager |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2976 def _writing(self, transaction): |
47251
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
2977 if self._trypending: |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
2978 msg = b'try to write in a `trypending` revlog: %s' |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
2979 msg %= self.display_id |
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47250
diff
changeset
|
2980 raise error.ProgrammingError(msg) |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2981 if self._inner.is_writing: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2982 yield |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2983 else: |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2984 data_end = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2985 sidedata_end = None |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2986 if self._docket is not None: |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2987 data_end = self._docket.data_end |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2988 sidedata_end = self._docket.sidedata_end |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2989 with self._inner.writing( |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2990 transaction, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2991 data_end=data_end, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2992 sidedata_end=sidedata_end, |
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
2993 ): |
47335
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47332
diff
changeset
|
2994 yield |
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47332
diff
changeset
|
2995 if self._docket is not None: |
1844a2e3401c
revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47332
diff
changeset
|
2996 self._write_docket(transaction) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2997 |
51110
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
2998 @property |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
2999 def is_delaying(self): |
d83d788590a8
changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51109
diff
changeset
|
3000 return self._inner.is_delaying |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3001 |
47250
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3002 def _write_docket(self, transaction): |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3003 """write the current docket on disk |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3004 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3005 Exist as a method to help changelog to implement transaction logic |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3006 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3007 We could also imagine using the same transaction logic for all revlog |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3008 since docket are cheap.""" |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3009 self._docket.write(transaction) |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
3010 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3011 def addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3012 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3013 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3014 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3015 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3016 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3017 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3018 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3019 node=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3020 flags=REVIDX_DEFAULT_FLAGS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3021 deltacomputer=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3022 sidedata=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3023 ): |
1083 | 3024 """add a revision to the log |
3025 | |
3026 text - the revision data to add | |
3027 transaction - the transaction object used for rollback | |
3028 link - the linkrev data to add | |
3029 p1, p2 - the parent nodeids of the revision | |
12012
bade7a9c5c07
revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12011
diff
changeset
|
3030 cachedelta - an optional precomputed delta |
19625
6a411a06cb1f
revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents:
19624
diff
changeset
|
3031 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
|
3032 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
|
3033 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
|
3034 flags - the known flags to set on the revision |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
3035 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
|
3036 multiple calls |
1083 | 3037 """ |
19326
7014526d67a8
revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents:
19200
diff
changeset
|
3038 if link == nullrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3039 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3040 _(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
|
3041 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
3042 |
42988
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
3043 if sidedata is None: |
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
3044 sidedata = {} |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
3045 elif sidedata and not self.feature_config.has_side_data: |
43030
827cb4fe62a3
sidedata: introduce a new requirement to protect the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43027
diff
changeset
|
3046 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3047 _(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
|
3048 ) |
42988
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
3049 |
30745 | 3050 if flags: |
3051 node = node or self.hash(text, p1, p2) | |
3052 | |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3053 rawtext, validatehash = flagutil.processflagswrite(self, text, flags) |
30745 | 3054 |
3055 # If the flag processor modifies the revision data, ignore any provided | |
3056 # cachedelta. | |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3057 if rawtext != text: |
30745 | 3058 cachedelta = None |
3059 | |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3060 if len(rawtext) > _maxentrysize: |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
3061 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3062 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3063 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
|
3064 ) |
47176
dfe8074239de
revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47175
diff
changeset
|
3065 % (self.display_id, len(rawtext)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3066 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
3067 |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3068 node = node or self.hash(rawtext, p1, p2) |
46560
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3069 rev = self.index.get_rev(node) |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3070 if rev is not None: |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3071 return rev |
12023
44c22dc193a4
revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12012
diff
changeset
|
3072 |
30745 | 3073 if validatehash: |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
3074 self.checkhash(rawtext, node, p1=p1, p2=p2) |
30745 | 3075 |
46560
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
3076 return self.addrawrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3077 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3078 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3079 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3080 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3081 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3082 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3083 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3084 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3085 deltacomputer=deltacomputer, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3086 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3087 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3088 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3089 def addrawrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3090 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3091 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3092 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3093 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3094 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3095 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3096 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3097 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3098 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3099 deltacomputer=None, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3100 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3101 ): |
32284
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3102 """add a raw revision with known flags, node and parents |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3103 useful when reusing a revision not stored in this revlog (ex: received |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3104 over wire, or read from an external bundle). |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
3105 """ |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3106 with self._writing(transaction): |
46559
9ee4e988e2be
revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46558
diff
changeset
|
3107 return self._addrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3108 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3109 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3110 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3111 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3112 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3113 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3114 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3115 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3116 deltacomputer=deltacomputer, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3117 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3118 ) |
3390
a74addddd092
make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3360
diff
changeset
|
3119 |
51737
df6ce326936f
typing: add a few type hints to `mercurial/revlog.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51650
diff
changeset
|
3120 def compress(self, data: bytes) -> Tuple[bytes, bytes]: |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
3121 return self._inner.compress(data) |
17128
1028a1c9077a
revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents:
17009
diff
changeset
|
3122 |
30793
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
3123 def decompress(self, data): |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
3124 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
|
3125 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3126 def _addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3127 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3128 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3129 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3130 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3131 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3132 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3133 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3134 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3135 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3136 alwayscache=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3137 deltacomputer=None, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3138 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3139 ): |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3140 """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
|
3141 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3142 see addrevision for argument descriptions. |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3143 |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3144 note: "addrevision" takes non-raw text, "_addrevision" takes raw text. |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3145 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3146 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
|
3147 be used. |
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3148 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
3149 invariants: |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3150 - 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
|
3151 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
|
3152 """ |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3153 if node == self.nullid: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3154 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3155 _(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
|
3156 ) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3157 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3158 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3159 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
3160 ): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3161 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
3162 _(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
|
3163 ) |
51896
2fd44b3dcc33
revlog: use the method to check if the revlog is being written to
Raphaël Gomès <rgomes@octobus.net>
parents:
51895
diff
changeset
|
3164 if not self._inner.is_writing: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3165 msg = b'adding revision outside `revlog._writing` context' |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3166 raise error.ProgrammingError(msg) |
34045
bfb38c5cebf4
revlog: move check for wdir from changelog to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
34044
diff
changeset
|
3167 |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3168 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
|
3169 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3170 curr = len(self) |
4981
e7131935fbb3
revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents:
4980
diff
changeset
|
3171 prev = curr - 1 |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3172 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3173 offset = self._get_data_offset(prev) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3174 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3175 if self._concurrencychecker: |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
3176 ifh, dfh, sdfh = self._inner._writinghandles |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3177 # XXX no checking for the sidedata file |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3178 if self._inline: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3179 # offset is "as if" it were in the .d file, so we need to add on |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3180 # the size of the entry metadata. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3181 self._concurrencychecker( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3182 ifh, self._indexfile, offset + curr * self.index.entry_size |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3183 ) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3184 else: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3185 # Entries in the .i are a consistent size. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3186 self._concurrencychecker( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3187 ifh, self._indexfile, curr * self.index.entry_size |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3188 ) |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3189 self._concurrencychecker(dfh, self._datafile, offset) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
3190 |
12889
5482c6b826f4
revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents:
12888
diff
changeset
|
3191 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
|
3192 |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3193 # 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
|
3194 # become comparable to the uncompressed text |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3195 if rawtext is None: |
35841
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
3196 # need rawtext size, before changed by flag processors, which is |
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
3197 # the non-raw size. use revlog explicitly to avoid filelog's extra |
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
3198 # logic that might remove metadata size. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3199 textlen = mdiff.patchedsize( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3200 revlog.size(self, cachedelta[0]), cachedelta[1] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3201 ) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3202 else: |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3203 textlen = len(rawtext) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
3204 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3205 if deltacomputer is None: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3206 write_debug = None |
51059
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51056
diff
changeset
|
3207 if self.delta_config.debug_delta: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3208 write_debug = transaction._report |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3209 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3210 self, write_debug=write_debug |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3211 ) |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
3212 |
49791
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3213 if cachedelta is not None and len(cachedelta) == 2: |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3214 # If the cached delta has no information about how it should be |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3215 # reused, add the default reuse instruction according to the |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3216 # revlog's configuration. |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3217 if ( |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3218 self.delta_config.general_delta |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3219 and self.delta_config.lazy_delta_base |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3220 ): |
49791
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3221 delta_base_reuse = DELTA_BASE_REUSE_TRY |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3222 else: |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3223 delta_base_reuse = DELTA_BASE_REUSE_NO |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3224 cachedelta = (cachedelta[0], cachedelta[1], delta_base_reuse) |
05db41701ece
find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49778
diff
changeset
|
3225 |
47405
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3226 revinfo = revlogutils.revisioninfo( |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3227 node, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3228 p1, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3229 p2, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3230 btext, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3231 textlen, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3232 cachedelta, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3233 flags, |
34cc102c73f5
revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47402
diff
changeset
|
3234 ) |
35840
33275ab5e837
revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents:
35839
diff
changeset
|
3235 |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3236 deltainfo = deltacomputer.finddeltainfo(revinfo) |
35634
b43578ec483a
revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents:
35525
diff
changeset
|
3237 |
47264
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
3238 compression_mode = COMP_MODE_INLINE |
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
3239 if self._docket is not None: |
47458
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47456
diff
changeset
|
3240 default_comp = self._docket.default_compression_header |
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47456
diff
changeset
|
3241 r = deltautil.delta_compression(default_comp, deltainfo) |
c6844912c327
revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47456
diff
changeset
|
3242 compression_mode, deltainfo = r |
47264
b876f0bf7366
revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47263
diff
changeset
|
3243 |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
3244 sidedata_compression_mode = COMP_MODE_INLINE |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
3245 if sidedata and self.feature_config.has_side_data: |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47266
diff
changeset
|
3246 sidedata_compression_mode = COMP_MODE_PLAIN |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3247 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata) |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3248 sidedata_offset = self._docket.sidedata_end |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
3249 h, comp_sidedata = self._inner.compress(serialized_sidedata) |
47269
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3250 if ( |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3251 h != b'u' |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3252 and comp_sidedata[0:1] != b'\0' |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3253 and len(comp_sidedata) < len(serialized_sidedata) |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3254 ): |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3255 assert not h |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3256 if ( |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3257 comp_sidedata[0:1] |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3258 == self._docket.default_compression_header |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3259 ): |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3260 sidedata_compression_mode = COMP_MODE_DEFAULT |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3261 serialized_sidedata = comp_sidedata |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3262 else: |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3263 sidedata_compression_mode = COMP_MODE_INLINE |
c4dbb7636a12
revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
3264 serialized_sidedata = comp_sidedata |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3265 else: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3266 serialized_sidedata = b"" |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3267 # Don't store the offset if the sidedata is empty, that way |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3268 # we can easily detect empty sidedata and they will be no different |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3269 # than ones we manually add. |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3270 sidedata_offset = 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3271 |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
3272 rank = RANK_UNKNOWN |
51069
81f3877372c3
revlog: remove legacy usage of `_compute_rank`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51066
diff
changeset
|
3273 if self.feature_config.compute_rank: |
48768
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3274 if (p1r, p2r) == (nullrev, nullrev): |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3275 rank = 1 |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3276 elif p1r != nullrev and p2r == nullrev: |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3277 rank = 1 + self.fast_rank(p1r) |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3278 elif p1r == nullrev and p2r != nullrev: |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3279 rank = 1 + self.fast_rank(p2r) |
580660518459
rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents:
48764
diff
changeset
|
3280 else: # merge node |
48946
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3281 if rustdagop is not None and self.index.rust_ext_compat: |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3282 rank = rustdagop.rank(self.index, p1r, p2r) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3283 else: |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3284 pmin, pmax = sorted((p1r, p2r)) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3285 rank = 1 + self.fast_rank(pmax) |
6ea9ead59cf8
revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents:
48942
diff
changeset
|
3286 rank += sum(1 for _ in self.findmissingrevs([pmax], [pmin])) |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
3287 |
47402
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3288 e = revlogutils.entry( |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3289 flags=flags, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3290 data_offset=offset, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3291 data_compressed_length=deltainfo.deltalen, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3292 data_uncompressed_length=textlen, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3293 data_compression_mode=compression_mode, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3294 data_delta_base=deltainfo.base, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3295 link_rev=link, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3296 parent_rev_1=p1r, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3297 parent_rev_2=p2r, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3298 node_id=node, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3299 sidedata_offset=sidedata_offset, |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3300 sidedata_compressed_length=len(serialized_sidedata), |
8230f0204eb8
revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
3301 sidedata_compression_mode=sidedata_compression_mode, |
48764
2e949ede7350
rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48695
diff
changeset
|
3302 rank=rank, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3303 ) |
46717
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46646
diff
changeset
|
3304 |
38889
6104b203bec8
index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38888
diff
changeset
|
3305 self.index.append(e) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
3306 entry = self.index.entry_binary(curr) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
3307 if curr == 0 and self._docket is None: |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3308 header = self._format_flags | self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3309 header = self.index.pack_header(header) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
3310 entry = header + entry |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3311 self._writeentry( |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3312 transaction, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3313 entry, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3314 deltainfo.data, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3315 link, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3316 offset, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3317 serialized_sidedata, |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3318 sidedata_offset, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3319 ) |
39360
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
3320 |
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
3321 rawtext = btext[0] |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
3322 |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
3323 if alwayscache and rawtext is None: |
51025
509f0f7fc89e
delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51023
diff
changeset
|
3324 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
|
3325 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3326 if type(rawtext) == bytes: # only accept immutable objects |
51100
8ec2de9c6770
revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51099
diff
changeset
|
3327 self._inner._revisioncache = (node, curr, rawtext) |
39360
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
3328 self._chainbasecache[curr] = deltainfo.chainbase |
46558
07984507d553
revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46530
diff
changeset
|
3329 return curr |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
3330 |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3331 def _get_data_offset(self, prev): |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3332 """Returns the current offset in the (in-transaction) data file. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3333 Versions < 2 of the revlog can get this 0(1), revlog v2 needs a docket |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3334 file to store that information: since sidedata can be rewritten to the |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3335 end of the data file within a transaction, you can have cases where, for |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3336 example, rev `n` does not have sidedata while rev `n - 1` does, leading |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3337 to `n - 1`'s sidedata being written after `n`'s data. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3338 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3339 TODO cache this in a docket file before getting out of experimental.""" |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3340 if self._docket is None: |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3341 return self.end(prev) |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3342 else: |
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3343 return self._docket.data_end |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Raphaël Gomès <rgomes@octobus.net>
parents:
46722
diff
changeset
|
3344 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3345 def _writeentry( |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3346 self, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3347 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3348 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3349 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3350 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3351 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3352 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3353 sidedata_offset, |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3354 ): |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3355 # 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
|
3356 # 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
|
3357 # 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
|
3358 # 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
|
3359 # 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
|
3360 # 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
|
3361 # 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
|
3362 # |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
3363 # We work around this issue by inserting a seek() before writing. |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3364 # Note: This is likely not necessary on Python 3. However, because |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3365 # the file handle is reused for reads and may be seeked there, we need |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3366 # to be careful before changing this. |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3367 index_end = data_end = sidedata_end = None |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3368 if self._docket is not None: |
51103
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3369 index_end = self._docket.index_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3370 data_end = self._docket.data_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3371 sidedata_end = self._docket.sidedata_end |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3372 |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3373 files_end = self._inner.write_entry( |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3374 transaction, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3375 entry, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3376 data, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3377 link, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3378 offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3379 sidedata, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3380 sidedata_offset, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3381 index_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3382 data_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3383 sidedata_end, |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3384 ) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3385 self._enforceinlinesize(transaction) |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3386 if self._docket is not None: |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3387 self._docket.index_end = files_end[0] |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3388 self._docket.data_end = files_end[1] |
eba138890c64
revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51102
diff
changeset
|
3389 self._docket.sidedata_end = files_end[2] |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3390 |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
3391 nodemaputil.setup_persistent_nodemap(transaction, self) |
2073 | 3392 |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3393 def addgroup( |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3394 self, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3395 deltas, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3396 linkmapper, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3397 transaction, |
46445
711ba0f1057e
revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents:
46310
diff
changeset
|
3398 alwayscache=False, |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3399 addrevisioncb=None, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3400 duplicaterevisioncb=None, |
49739
35d4c2124073
debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49738
diff
changeset
|
3401 debug_info=None, |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3402 delta_base_reuse_policy=None, |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3403 ): |
1083 | 3404 """ |
3405 add a delta group | |
46 | 3406 |
1083 | 3407 given a set of deltas, add them to the revision log. the |
3408 first delta is against its parent, which should be in our | |
3409 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
|
3410 |
00e3f909907f
revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
3411 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
|
3412 this revlog and the node that was added. |
1083 | 3413 """ |
3414 | |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3415 if self._adding_group: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3416 raise error.ProgrammingError(b'cannot nest addgroup() calls') |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
3417 |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3418 # read the default delta-base reuse policy from revlog config if the |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3419 # group did not specify one. |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3420 if delta_base_reuse_policy is None: |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3421 if ( |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3422 self.delta_config.general_delta |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3423 and self.delta_config.lazy_delta_base |
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3424 ): |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3425 delta_base_reuse_policy = DELTA_BASE_REUSE_TRY |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3426 else: |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3427 delta_base_reuse_policy = DELTA_BASE_REUSE_NO |
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3428 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3429 self._adding_group = True |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3430 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
|
3431 try: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3432 with self._writing(transaction): |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3433 write_debug = None |
51059
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51056
diff
changeset
|
3434 if self.delta_config.debug_delta: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3435 write_debug = transaction._report |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3436 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3437 self, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3438 write_debug=write_debug, |
49739
35d4c2124073
debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49738
diff
changeset
|
3439 debug_info=debug_info, |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3440 ) |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3441 # loop through our set of deltas |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3442 for data in deltas: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3443 ( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3444 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3445 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3446 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3447 linknode, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3448 deltabase, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3449 delta, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3450 flags, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3451 sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3452 ) = data |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3453 link = linkmapper(linknode) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3454 flags = flags or REVIDX_DEFAULT_FLAGS |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3455 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3456 rev = self.index.get_rev(node) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3457 if rev is not None: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3458 # this can happen if two branches make the same change |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3459 self._nodeduplicatecallback(transaction, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3460 if duplicaterevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3461 duplicaterevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3462 empty = False |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3463 continue |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3464 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3465 for p in (p1, p2): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3466 if not self.index.has_node(p): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3467 raise error.LookupError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3468 p, self.radix, _(b'unknown parent') |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3469 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3470 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3471 if not self.index.has_node(deltabase): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3472 raise error.LookupError( |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3473 deltabase, self.display_id, _(b'unknown delta base') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3474 ) |
24120
a450e0a2ba0a
revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents:
24118
diff
changeset
|
3475 |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3476 baserev = self.rev(deltabase) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3477 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3478 if baserev != nullrev and self.iscensored(baserev): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3479 # if base is censored, delta must be full replacement in a |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3480 # single patch operation |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3481 hlen = struct.calcsize(b">lll") |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3482 oldlen = self.rawsize(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3483 newlen = len(delta) - hlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3484 if delta[:hlen] != mdiff.replacediffheader( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3485 oldlen, newlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3486 ): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3487 raise error.CensoredBaseError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3488 self.display_id, self.node(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3489 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3490 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3491 if not flags and self._peek_iscensored(baserev, delta): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3492 flags |= REVIDX_ISCENSORED |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3493 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3494 # We assume consumers of addrevisioncb will want to retrieve |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3495 # the added revision, which will require a call to |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3496 # revision(). revision() will fast path if there is a cache |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3497 # hit. So, we tell _addrevision() to always cache in this case. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3498 # We're only using addgroup() in the context of changegroup |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3499 # generation so the revision data can always be handled as raw |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3500 # by the flagprocessor. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3501 rev = self._addrevision( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3502 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3503 None, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3504 transaction, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3505 link, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3506 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3507 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3508 flags, |
49877
152d9c011bcd
changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49791
diff
changeset
|
3509 (baserev, delta, delta_base_reuse_policy), |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3510 alwayscache=alwayscache, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3511 deltacomputer=deltacomputer, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3512 sidedata=sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3513 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3514 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3515 if addrevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3516 addrevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
3517 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
|
3518 finally: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
3519 self._adding_group = False |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
3520 return not empty |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3521 |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3522 def iscensored(self, rev): |
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3523 """Check if a file revision is censored.""" |
51055
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
3524 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
|
3525 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3526 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3527 return self.flags(rev) & REVIDX_ISCENSORED |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
3528 |
47180
c9ae2e7fe154
revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47179
diff
changeset
|
3529 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
|
3530 """Quickly check if a delta produces a censored revision.""" |
51055
0d33f4b0c4cb
revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51054
diff
changeset
|
3531 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
|
3532 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
3533 |
40325
b0fbd1792e2d
storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40298
diff
changeset
|
3534 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
|
3535 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3536 def getstrippoint(self, minlink): |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3537 """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
|
3538 |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3539 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
|
3540 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
|
3541 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3542 return storageutil.resolvestripinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3543 minlink, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3544 len(self) - 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3545 self.headrevs(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3546 self.linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3547 self.parentrevs, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3548 ) |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3549 |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8017
diff
changeset
|
3550 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
|
3551 """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
|
3552 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3553 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
|
3554 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
|
3555 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3556 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
|
3557 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
|
3558 strip. |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3559 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
3560 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
|
3561 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
|
3562 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
|
3563 """ |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3564 if len(self) == 0: |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3565 return |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3566 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3567 rev, _ = self.getstrippoint(minlink) |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
3568 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
|
3569 return |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3570 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3571 # first truncate the files on disk |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3572 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
|
3573 if not self._inline: |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3574 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
|
3575 end = rev * self.index.entry_size |
2073 | 3576 else: |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3577 end = data_end + (rev * self.index.entry_size) |
2072 | 3578 |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3579 if self._sidedatafile: |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3580 sidedata_end = self.sidedata_cut_off(rev) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3581 transaction.add(self._sidedatafile, sidedata_end) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3582 |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3583 transaction.add(self._indexfile, end) |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3584 if self._docket is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3585 # XXX we could, leverage the docket while stripping. However it is |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3586 # not powerfull enough at the time of this comment |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3587 self._docket.index_end = end |
47253
4abd474a10af
revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47252
diff
changeset
|
3588 self._docket.data_end = data_end |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
3589 self._docket.sidedata_end = sidedata_end |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
3590 self._docket.write(transaction, stripping=True) |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3591 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3592 # then reset internal state in memory to forget those revisions |
45802
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
3593 self._chaininfocache = util.lrucachedict(500) |
51105
045b5f745f93
revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51103
diff
changeset
|
3594 self._inner.clear_cache() |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3595 |
4979
06abdaf78788
revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents:
4978
diff
changeset
|
3596 del self.index[rev:-1] |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
3597 |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3598 def checksize(self): |
41877
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3599 """Check size of index and data files |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3600 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3601 return a (dd, di) tuple. |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3602 - dd: extra bytes for the "data" file |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3603 - di: extra bytes for the "index" file |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3604 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3605 A healthy revlog will return (0, 0). |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
3606 """ |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
3607 expected = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3608 if len(self): |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3609 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
|
3610 |
1494
249ca10d37f4
Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
3611 try: |
36011
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
36010
diff
changeset
|
3612 with self._datafp() as f: |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
3613 f.seek(0, io.SEEK_END) |
36011
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
36010
diff
changeset
|
3614 actual = f.tell() |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3615 dd = actual - expected |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
3616 except FileNotFoundError: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3617 dd = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3618 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3619 try: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3620 f = self.opener(self._indexfile) |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
3621 f.seek(0, io.SEEK_END) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3622 actual = f.tell() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13284
diff
changeset
|
3623 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
|
3624 s = self.index.entry_size |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8658
diff
changeset
|
3625 i = max(0, actual // s) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3626 di = actual - (i * s) |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
3627 if self._inline: |
2073 | 3628 databytes = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3629 for r in self: |
5312
fb070713ff36
revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents:
5007
diff
changeset
|
3630 databytes += max(0, self.length(r)) |
2073 | 3631 dd = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
3632 di = actual - len(self) * s - databytes |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
3633 except FileNotFoundError: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3634 di = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3635 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
3636 return (dd, di) |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3637 |
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
3638 def files(self): |
51086
808f1e38cd1d
revlog: small doc to the `files` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51085
diff
changeset
|
3639 """return list of files that compose this revlog""" |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3640 res = [self._indexfile] |
47456
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3641 if self._docket_file is None: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3642 if not self._inline: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3643 res.append(self._datafile) |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3644 else: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3645 res.append(self._docket_file) |
47461
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47458
diff
changeset
|
3646 res.extend(self._docket.old_index_filepaths(include_empty=False)) |
47456
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3647 if self._docket.data_end: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3648 res.append(self._datafile) |
47461
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47458
diff
changeset
|
3649 res.extend(self._docket.old_data_filepaths(include_empty=False)) |
47456
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3650 if self._docket.sidedata_end: |
9cecc222c536
revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47432
diff
changeset
|
3651 res.append(self._sidedatafile) |
47461
f93a867a6486
revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47458
diff
changeset
|
3652 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
|
3653 return res |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3654 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3655 def emitrevisions( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3656 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3657 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3658 nodesorder=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3659 revisiondata=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3660 assumehaveparentrevisions=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3661 deltamode=repository.CG_DELTAMODE_STD, |
46728
45f0d5297698
changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents:
46725
diff
changeset
|
3662 sidedata_helpers=None, |
49738
9cac281eb9c0
debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49712
diff
changeset
|
3663 debug_info=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3664 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3665 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
|
3666 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3667 b'unhandled value for nodesorder: %s' % nodesorder |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3668 ) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
3669 |
51051
f636103c4d67
revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51049
diff
changeset
|
3670 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
|
3671 nodesorder = b'storage' |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
3672 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3673 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3674 not self._storedeltachains |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3675 and deltamode != repository.CG_DELTAMODE_PREV |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3676 ): |
40495
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3677 deltamode = repository.CG_DELTAMODE_FULL |
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3678 |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3679 return storageutil.emitrevisions( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3680 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3681 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3682 nodesorder, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3683 revlogrevisiondelta, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3684 deltaparentfn=self.deltaparent, |
51009
39fa0b948f5a
revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51008
diff
changeset
|
3685 candeltafn=self._candelta, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3686 rawsizefn=self.rawsize, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3687 revdifffn=self.revdiff, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3688 flagsfn=self.flags, |
40495
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
3689 deltamode=deltamode, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
3690 revisiondata=revisiondata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3691 assumehaveparentrevisions=assumehaveparentrevisions, |
46728
45f0d5297698
changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents:
46725
diff
changeset
|
3692 sidedata_helpers=sidedata_helpers, |
49738
9cac281eb9c0
debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49712
diff
changeset
|
3693 debug_info=debug_info, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3694 ) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
3695 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3696 DELTAREUSEALWAYS = b'always' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3697 DELTAREUSESAMEREVS = b'samerevs' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3698 DELTAREUSENEVER = b'never' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3699 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3700 DELTAREUSEFULLADD = b'fulladd' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3701 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3702 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
|
3703 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3704 def clone( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3705 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3706 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3707 destrevlog, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3708 addrevisioncb=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3709 deltareuse=DELTAREUSESAMEREVS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3710 forcedeltabothparents=None, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3711 sidedata_helpers=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3712 ): |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3713 """Copy this revlog to another, possibly with format changes. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3714 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3715 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
|
3716 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
|
3717 differences. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3718 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3719 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
|
3720 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
|
3721 following values: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3722 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3723 DELTAREUSEALWAYS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3724 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
|
3725 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
|
3726 fastest mode of operation. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3727 DELTAREUSESAMEREVS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3728 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
|
3729 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
|
3730 and optimization. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3731 DELTAREUSENEVER |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3732 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
|
3733 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
|
3734 algorithm changes). |
42999
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3735 DELTAREUSEFULLADD |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3736 Revision will be re-added as if their were new content. This is |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3737 slower than DELTAREUSEALWAYS but allow more mechanism to kicks in. |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
3738 eg: large file detection and handling. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3739 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3740 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
|
3741 significantly affect run time. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3742 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3743 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3744 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
|
3745 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
|
3746 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
|
3747 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
|
3748 revision. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3749 |
40855
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
3750 In addition to the delta policy, the ``forcedeltabothparents`` |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
3751 argument controls whether to force compute deltas against both parents |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
3752 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
|
3753 |
47100
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Raphaël Gomès <rgomes@octobus.net>
parents:
47099
diff
changeset
|
3754 See `revlogutil.sidedata.get_sidedata_helpers` for the doc on |
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Raphaël Gomès <rgomes@octobus.net>
parents:
47099
diff
changeset
|
3755 `sidedata_helpers`. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3756 """ |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3757 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
|
3758 raise ValueError( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3759 _(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
|
3760 ) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3761 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3762 if len(destrevlog): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3763 raise ValueError(_(b'destination revlog is not empty')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3764 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3765 if getattr(self, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3766 raise ValueError(_(b'source revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3767 if getattr(destrevlog, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3768 raise ValueError(_(b'destination revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3769 |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
3770 # lazydelta and lazydeltabase controls whether to reuse a cached delta, |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
3771 # if possible. |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3772 old_delta_config = destrevlog.delta_config |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3773 destrevlog.delta_config = destrevlog.delta_config.copy() |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3774 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3775 try: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3776 if deltareuse == self.DELTAREUSEALWAYS: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3777 destrevlog.delta_config.lazy_delta_base = True |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3778 destrevlog.delta_config.lazy_delta = True |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3779 elif deltareuse == self.DELTAREUSESAMEREVS: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3780 destrevlog.delta_config.lazy_delta_base = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3781 destrevlog.delta_config.lazy_delta = True |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
3782 elif deltareuse == self.DELTAREUSENEVER: |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3783 destrevlog.delta_config.lazy_delta_base = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3784 destrevlog.delta_config.lazy_delta = False |
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3785 |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3786 delta_both_parents = ( |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3787 forcedeltabothparents or old_delta_config.delta_both_parents |
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3788 ) |
51034
498afb627f78
revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51031
diff
changeset
|
3789 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
|
3790 |
50792
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3791 with self.reading(), destrevlog._writing(tr): |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3792 self._clone( |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3793 tr, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3794 destrevlog, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3795 addrevisioncb, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3796 deltareuse, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3797 forcedeltabothparents, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3798 sidedata_helpers, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3799 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3800 |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
3801 finally: |
51035
177e7d6bf875
revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51034
diff
changeset
|
3802 destrevlog.delta_config = old_delta_config |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3803 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3804 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
|
3805 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
|
3806 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
|
3807 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
|
3808 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
|
3809 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
|
3810 forcedeltabothparents, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3811 sidedata_helpers, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3812 ): |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3813 """perform the core duty of `revlog.clone` after parameter processing""" |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3814 write_debug = None |
51059
ab2bc31fa91f
revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51056
diff
changeset
|
3815 if self.delta_config.debug_delta: |
49248
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3816 write_debug = tr._report |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3817 deltacomputer = deltautil.deltacomputer( |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3818 destrevlog, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3819 write_debug=write_debug, |
2bcf5e14bb7e
deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49077
diff
changeset
|
3820 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3821 index = self.index |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3822 for rev in self: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3823 entry = index[rev] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3824 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3825 # Some classes override linkrev to take filtered revs into |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3826 # account. Use raw entry from index. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3827 flags = entry[0] & 0xFFFF |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3828 linkrev = entry[4] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3829 p1 = index[entry[5]][7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3830 p2 = index[entry[6]][7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3831 node = entry[7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3832 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3833 # (Possibly) reuse the delta from the revlog if allowed and |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3834 # the revlog chunk is a delta. |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3835 cachedelta = None |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3836 rawtext = None |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3837 if deltareuse == self.DELTAREUSEFULLADD: |
47391
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47390
diff
changeset
|
3838 text = self._revisiondata(rev) |
47390
fec306b05328
revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47388
diff
changeset
|
3839 sidedata = self.sidedata(rev) |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3840 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3841 if sidedata_helpers is not None: |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents:
47098
diff
changeset
|
3842 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3843 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3844 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3845 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
|
3846 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3847 destrevlog.addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3848 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3849 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3850 linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3851 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3852 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3853 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3854 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3855 flags=flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3856 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
|
3857 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3858 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3859 else: |
51071
b79c73a7afce
revlog: remove legacy usage of `_lazydelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51070
diff
changeset
|
3860 if destrevlog.delta_config.lazy_delta: |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3861 dp = self.deltaparent(rev) |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3862 if dp != nullrev: |
51096
9c8df10ea6e0
revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51095
diff
changeset
|
3863 cachedelta = (dp, bytes(self._inner._chunk(rev))) |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3864 |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3865 sidedata = None |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3866 if not cachedelta: |
50791
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3867 try: |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3868 rawtext = self._revisiondata(rev) |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3869 except error.CensoredNodeError as censored: |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3870 assert flags & REVIDX_ISCENSORED |
2dec23658969
censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50789
diff
changeset
|
3871 rawtext = censored.tombstone |
47390
fec306b05328
revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47388
diff
changeset
|
3872 sidedata = self.sidedata(rev) |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3873 if sidedata is None: |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3874 sidedata = self.sidedata(rev) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3875 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3876 if sidedata_helpers is not None: |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents:
47098
diff
changeset
|
3877 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3878 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3879 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents:
47095
diff
changeset
|
3880 flags = flags | new_flags[0] & ~new_flags[1] |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
3881 |
50792
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3882 destrevlog._addrevision( |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3883 node, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3884 rawtext, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3885 tr, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3886 linkrev, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3887 p1, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3888 p2, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3889 flags, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3890 cachedelta, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3891 deltacomputer=deltacomputer, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3892 sidedata=sidedata, |
315c74911993
revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50791
diff
changeset
|
3893 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3894 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3895 if addrevisioncb: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3896 addrevisioncb(self, rev, node) |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
3897 |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51283
diff
changeset
|
3898 def censorrevision(self, tr, censor_nodes, tombstone=b''): |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3899 if self._format_version == REVLOGV0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3900 raise error.RevlogError( |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3901 _(b'cannot censor with version %d revlogs') |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3902 % self._format_version |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3903 ) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
3904 elif self._format_version == REVLOGV1: |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51283
diff
changeset
|
3905 rewrite.v1_censor(self, tr, censor_nodes, tombstone) |
47397
33d626910374
revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47395
diff
changeset
|
3906 else: |
51290
ceeb8fa23cc8
censor: accept multiple revision in a single call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51283
diff
changeset
|
3907 rewrite.v2_censor(self, tr, censor_nodes, tombstone) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3908 |
51868
0338fb200a30
typing: lock in new pytype gains from making revlog related classes typeable
Matt Harbison <matt_harbison@yahoo.com>
parents:
51867
diff
changeset
|
3909 def verifyintegrity(self, state) -> Iterable[RevLogProblem]: |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3910 """Verifies the integrity of the revlog. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3911 |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3912 Yields ``revlogproblem`` instances describing problems that are |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3913 found. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3914 """ |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3915 dd, di = self.checksize() |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3916 if dd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3917 yield revlogproblem(error=_(b'data length off by %d bytes') % dd) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3918 if di: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3919 yield revlogproblem(error=_(b'index contains %d extra bytes') % di) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3920 |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3921 version = self._format_version |
39850
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
3922 |
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
3923 # 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
|
3924 if version != state[b'expectedversion']: |
39850
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
3925 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3926 warning=_(b"warning: '%s' uses revlog format %d; expected %d") |
47171
3a9f3470922c
revlog: use revlog.display_id in format related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47169
diff
changeset
|
3927 % (self.display_id, version, state[b'expectedversion']) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3928 ) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3929 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3930 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
|
3931 state[b'safe_renamed'] = set() |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3932 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3933 for rev in self: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3934 node = self.node(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3935 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3936 # Verify contents. 4 cases to care about: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3937 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3938 # common: the most common case |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3939 # rename: with a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3940 # meta: file content starts with b'\1\n', the metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3941 # header defined in filelog.py, but without a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3942 # ext: content stored externally |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3943 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3944 # More formally, their differences are shown below: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3945 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3946 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3947 # ------------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3948 # flags() | 0 | 0 | 0 | not 0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3949 # renamed() | False | True | False | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3950 # rawtext[0:2]=='\1\n'| False | True | True | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3951 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3952 # "rawtext" means the raw text stored in revlog data, which |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3953 # could be retrieved by "rawdata(rev)". "text" |
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3954 # mentioned below is "revision(rev)". |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3955 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3956 # There are 3 different lengths stored physically: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3957 # 1. L1: rawsize, stored in revlog index |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3958 # 2. L2: len(rawtext), stored in revlog data |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3959 # 3. L3: len(text), stored in revlog data if flags==0, or |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3960 # possibly somewhere else if flags!=0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3961 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3962 # L1 should be equal to L2. L3 could be different from them. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3963 # "text" may or may not affect commit hash depending on flag |
42749
6d61be152c55
flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42748
diff
changeset
|
3964 # processors (see flagutil.addflagprocessor). |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3965 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3966 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3967 # ------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3968 # rawsize() | L1 | L1 | L1 | L1 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3969 # size() | L1 | L2-LM | L1(*) | L1 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3970 # len(rawtext) | L2 | L2 | L2 | L2 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3971 # len(text) | L2 | L2 | L2 | L3 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3972 # len(read()) | L2 | L2-LM | L2-LM | L3 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3973 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3974 # LM: length of metadata, depending on rawtext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3975 # (*): not ideal, see comment in filelog.size |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3976 # (?): could be "- len(meta)" if the resolved content has |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3977 # rename metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3978 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3979 # Checks needed to be done: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3980 # 1. length check: L1 == L2, in all cases. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3981 # 2. hash check: depending on flag processor, we may need to |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3982 # use either "text" (external), or "rawtext" (in revlog). |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3983 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3984 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3985 skipflags = state.get(b'skipflags', 0) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3986 if skipflags: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3987 skipflags &= self.flags(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3988 |
43962
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
3989 _verify_revision(self, skipflags, state, node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3990 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3991 l1 = self.rawsize(rev) |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3992 l2 = len(self.rawdata(node)) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3993 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3994 if l1 != l2: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3995 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3996 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
|
3997 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3998 ) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3999 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4000 except error.CensoredNodeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4001 if state[b'erroroncensored']: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4002 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4003 error=_(b'censored file data'), node=node |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4004 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4005 state[b'skipread'].add(node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4006 except Exception as e: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4007 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4008 error=_(b'unpacking %s: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4009 % (short(node), stringutil.forcebytestr(e)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4010 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4011 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4012 state[b'skipread'].add(node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
4013 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4014 def storageinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4015 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4016 exclusivefiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4017 sharedfiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4018 revisionscount=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4019 trackedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4020 storedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4021 ): |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4022 d = {} |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4023 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4024 if exclusivefiles: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
4025 d[b'exclusivefiles'] = [(self.opener, self._indexfile)] |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4026 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
4027 d[b'exclusivefiles'].append((self.opener, self._datafile)) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4028 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4029 if sharedfiles: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4030 d[b'sharedfiles'] = [] |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4031 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4032 if revisionscount: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4033 d[b'revisionscount'] = len(self) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4034 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4035 if trackedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4036 d[b'trackedsize'] = sum(map(self.rawsize, iter(self))) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4037 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4038 if storedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
4039 d[b'storedsize'] = sum( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
4040 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
|
4041 ) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4042 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
4043 return d |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4044 |
47227
2bd4b5218918
revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47226
diff
changeset
|
4045 def rewrite_sidedata(self, transaction, helpers, startrev, endrev): |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
4046 if not self.feature_config.has_side_data: |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4047 return |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
4048 # revlog formats with sidedata support does not support inline |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4049 assert not self._inline |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4050 if not helpers[1] and not helpers[2]: |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4051 # Nothing to generate or remove |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4052 return |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4053 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4054 new_entries = [] |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4055 # append the new sidedata |
47229
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
4056 with self._writing(transaction): |
51090
c3748f38dcd0
revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51089
diff
changeset
|
4057 ifh, dfh, sdfh = self._inner._writinghandles |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4058 dfh.seek(self._docket.sidedata_end, os.SEEK_SET) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4059 |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4060 current_offset = sdfh.tell() |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4061 for rev in range(startrev, endrev + 1): |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4062 entry = self.index[rev] |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents:
47098
diff
changeset
|
4063 new_sidedata, flags = sidedatautil.run_sidedata_helpers( |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4064 store=self, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4065 sidedata_helpers=helpers, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4066 sidedata={}, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4067 rev=rev, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4068 ) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4069 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4070 serialized_sidedata = sidedatautil.serialize_sidedata( |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4071 new_sidedata |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4072 ) |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4073 |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4074 sidedata_compression_mode = COMP_MODE_INLINE |
51066
7c2dc75cdc0f
revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51065
diff
changeset
|
4075 if serialized_sidedata and self.feature_config.has_side_data: |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4076 sidedata_compression_mode = COMP_MODE_PLAIN |
51095
a82704902db8
revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51094
diff
changeset
|
4077 h, comp_sidedata = self._inner.compress(serialized_sidedata) |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4078 if ( |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4079 h != b'u' |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4080 and comp_sidedata[0] != b'\0' |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4081 and len(comp_sidedata) < len(serialized_sidedata) |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4082 ): |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4083 assert not h |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4084 if ( |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4085 comp_sidedata[0] |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4086 == self._docket.default_compression_header |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4087 ): |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4088 sidedata_compression_mode = COMP_MODE_DEFAULT |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4089 serialized_sidedata = comp_sidedata |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4090 else: |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4091 sidedata_compression_mode = COMP_MODE_INLINE |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4092 serialized_sidedata = comp_sidedata |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4093 if entry[8] != 0 or entry[9] != 0: |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4094 # rewriting entries that already have sidedata is not |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4095 # supported yet, because it introduces garbage data in the |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4096 # revlog. |
47239
e51392acd70c
revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47233
diff
changeset
|
4097 msg = b"rewriting existing sidedata is not supported yet" |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4098 raise error.Abort(msg) |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4099 |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4100 # Apply (potential) flags to add and to remove after running |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4101 # the sidedata helpers |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4102 new_offset_flags = entry[0] | flags[0] & ~flags[1] |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4103 entry_update = ( |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4104 current_offset, |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4105 len(serialized_sidedata), |
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4106 new_offset_flags, |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47269
diff
changeset
|
4107 sidedata_compression_mode, |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4108 ) |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4109 |
47228
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
4110 # the sidedata computation might have move the file cursors around |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4111 sdfh.seek(current_offset, os.SEEK_SET) |
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4112 sdfh.write(serialized_sidedata) |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4113 new_entries.append(entry_update) |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4114 current_offset += len(serialized_sidedata) |
47395
e6292eb33384
revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47393
diff
changeset
|
4115 self._docket.sidedata_end = sdfh.tell() |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4116 |
47229
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
4117 # rewrite the new index entries |
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
4118 ifh.seek(startrev * self.index.entry_size) |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47094
diff
changeset
|
4119 for i, e in enumerate(new_entries): |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents:
46729
diff
changeset
|
4120 rev = startrev + i |
47256
de63be070e02
revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47253
diff
changeset
|
4121 self.index.replace_sidedata_info(rev, *e) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
4122 packed = self.index.entry_binary(rev) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
4123 if rev == 0 and self._docket is None: |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4124 header = self._format_flags | self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
4125 header = self.index.pack_header(header) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
4126 packed = header + packed |
47226
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47225
diff
changeset
|
4127 ifh.write(packed) |