annotate mercurial/revlog.py @ 51161:962974a5d068 stable

revlog: add one more assert about state of thing when splitting This assert is currently happy, but it does not hurt to adds it to clarify expected state and catch potential error in the future.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 06 Dec 2023 15:38:15 +0100
parents e9eac01c57f3
children 66417f55ea33
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
1 # revlog.py - storage back-end for mercurial
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2 # coding: utf8
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
3 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46806
diff changeset
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
5 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10047
diff changeset
7 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
8
8227
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
9 """Storage back-end for Mercurial.
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
10
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
11 This provides efficient delta storage with O(1) retrieve and append
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
12 and O(changes) merge between branches.
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
13 """
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
14
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
15
46852
fbfb1d6d8459 revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46819
diff changeset
16 import binascii
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 24454
diff changeset
17 import collections
35973
4d66993bdcff revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents: 35972
diff changeset
18 import contextlib
42567
4eaf7197a740 cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents: 42462
diff changeset
19 import io
27430
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
20 import os
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
21 import struct
50348
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
22 import weakref
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
23 import zlib
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
24
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
25 # import stuff from node for others to import from revlog
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
26 from .node import (
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
27 bin,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
28 hex,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
29 nullrev,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
30 sha1nodeconstants,
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
31 short,
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
32 wdirrev,
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
33 )
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
34 from .i18n import _
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
35 from .revlogutils.constants import (
47072
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
36 ALL_KINDS,
47266
921648d31553 changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47263
diff changeset
37 CHANGELOGV2,
47255
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
38 COMP_MODE_DEFAULT,
47249
130c9f7ed914 revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47246
diff changeset
39 COMP_MODE_INLINE,
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
40 COMP_MODE_PLAIN,
49677
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
41 DELTA_BASE_REUSE_NO,
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
42 DELTA_BASE_REUSE_TRY,
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
43 ENTRY_RANK,
47231
4d1c893b9095 revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47230
diff changeset
44 FEATURES_BY_VERSION,
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
45 FLAG_GENERALDELTA,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
46 FLAG_INLINE_DATA,
46859
c6e23fb4bfb4 revlog: move the "index header" struct inside revlog.utils.constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46858
diff changeset
47 INDEX_HEADER,
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
48 KIND_CHANGELOG,
49534
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
49 KIND_FILELOG,
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
50 RANK_UNKNOWN,
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
51 REVLOGV0,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
52 REVLOGV1,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
53 REVLOGV1_FLAGS,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
54 REVLOGV2,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
55 REVLOGV2_FLAGS,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
56 REVLOG_DEFAULT_FLAGS,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
57 REVLOG_DEFAULT_FORMAT,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
58 REVLOG_DEFAULT_VERSION,
47230
0e9105bf54cb revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47228
diff changeset
59 SUPPORTED_FLAGS,
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
60 )
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
61 from .revlogutils.flagutil import (
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
62 REVIDX_DEFAULT_FLAGS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
63 REVIDX_ELLIPSIS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
64 REVIDX_EXTSTORED,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
65 REVIDX_FLAGS_ORDER,
45671
2d6aea053153 copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45053
diff changeset
66 REVIDX_HASCOPIESINFO,
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
67 REVIDX_ISCENSORED,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
68 REVIDX_RAWTEXT_CHANGING_FLAGS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
69 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
70 from .thirdparty import attr
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
71 from . import (
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
72 ancestor,
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
73 dagop,
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
74 error,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
75 mdiff,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32315
diff changeset
76 policy,
31574
a8e55d6f1d67 revlog: use pycompat.maplist to eagerly evaluate map on Python 3
Augie Fackler <augie@google.com>
parents: 31504
diff changeset
77 pycompat,
47394
ac60a1366a49 revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47393
diff changeset
78 revlogutils,
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
79 templatefilters,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
80 util,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
81 )
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42792
diff changeset
82 from .interfaces import (
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42792
diff changeset
83 repository,
42814
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
84 util as interfaceutil,
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42792
diff changeset
85 )
39330
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
86 from .revlogutils import (
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
87 deltas as deltautil,
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
88 docket as docketutil,
42729
05c80f9ef100 flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42728
diff changeset
89 flagutil,
44034
ab595920de0e revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44014
diff changeset
90 nodemap as nodemaputil,
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
91 randomaccessfile,
47038
724db234b790 revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47037
diff changeset
92 revlogv0,
47465
bc8536e09a20 revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47463
diff changeset
93 rewrite,
43037
142deb539ccf sidedata: register the flag processors if the repository allows for it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43034
diff changeset
94 sidedata as sidedatautil,
39330
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
95 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36760
diff changeset
96 from .utils import (
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
97 storageutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36760
diff changeset
98 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36760
diff changeset
99 )
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
100
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
101 # blanked usage of all the name to prevent pyflakes constraints
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
102 # We need these name available in the module for extensions.
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
103
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
104 REVLOGV0
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
105 REVLOGV1
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
106 REVLOGV2
48769
1bb62821f080 revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents: 48765
diff changeset
107 CHANGELOGV2
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
108 FLAG_INLINE_DATA
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
109 FLAG_GENERALDELTA
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
110 REVLOG_DEFAULT_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
111 REVLOG_DEFAULT_FORMAT
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
112 REVLOG_DEFAULT_VERSION
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
113 REVLOGV1_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
114 REVLOGV2_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
115 REVIDX_ISCENSORED
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
116 REVIDX_ELLIPSIS
45671
2d6aea053153 copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45053
diff changeset
117 REVIDX_HASCOPIESINFO
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
118 REVIDX_EXTSTORED
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
119 REVIDX_DEFAULT_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
120 REVIDX_FLAGS_ORDER
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
121 REVIDX_RAWTEXT_CHANGING_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
122
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43440
diff changeset
123 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43440
diff changeset
124 rustancestor = policy.importrust('ancestor')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43440
diff changeset
125 rustdagop = policy.importrust('dagop')
44014
8042856c90b6 rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents: 43979
diff changeset
126 rustrevlog = policy.importrust('revlog')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32315
diff changeset
127
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
128 # Aliased for performance.
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
129 _zlibdecompress = zlib.decompress
5007
3addf4531643 revlog: localize some fastpath functions
Matt Mackall <mpm@selenic.com>
parents: 5006
diff changeset
130
49828
9854a9adc466 revlog: fix misleading comment about _maxinline
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49766
diff changeset
131 # max size of inline data embedded into a revlog
10916
9c84395a338e add documentation for revlog._prereadsize
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10914
diff changeset
132 _maxinline = 131072
10913
f2ecc5733c89 revlog: factor out _maxinline global.
Greg Ward <greg-hg@gerg.ca>
parents: 10404
diff changeset
133
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
134 # Flag processors for REVIDX_ELLIPSIS.
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
135 def ellipsisreadprocessor(rl, text):
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
136 return text, False
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
137
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
138
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
139 def ellipsiswriteprocessor(rl, text):
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
140 return text, False
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
141
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
142
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
143 def ellipsisrawprocessor(rl, text):
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
144 return False
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
145
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
146
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
147 ellipsisprocessor = (
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
148 ellipsisreadprocessor,
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
149 ellipsiswriteprocessor,
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
150 ellipsisrawprocessor,
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
151 )
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
152
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
153
43957
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
154 def _verify_revision(rl, skipflags, state, node):
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
155 """Verify the integrity of the given revlog ``node`` while providing a hook
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
156 point for extensions to influence the operation."""
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
157 if skipflags:
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
158 state[b'skipread'].add(node)
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
159 else:
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
160 # Side-effect: read content and verify hash.
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
161 rl.revision(node)
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
162
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
163
46310
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
164 # True if a fast implementation for persistent-nodemap is available
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
165 #
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
166 # We also consider we have a "fast" implementation in "pure" python because
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
167 # people using pure don't really have performance consideration (and a
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
168 # wheelbarrow of other slowness source)
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50811
diff changeset
169 HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or hasattr(
46310
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
170 parsers, 'BaseIndexObject'
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
171 )
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
172
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
173
39231
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
174 @interfaceutil.implementer(repository.irevisiondelta)
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
175 @attr.s(slots=True)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48928
diff changeset
176 class revlogrevisiondelta:
39231
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
177 node = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
178 p1node = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
179 p2node = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
180 basenode = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
181 flags = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
182 baserevisionsize = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
183 revision = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
184 delta = attr.ib()
46712
e8c11a2c96c0 delta: add sidedata field to revision delta
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46711
diff changeset
185 sidedata = attr.ib()
47077
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47075
diff changeset
186 protocol_flags = attr.ib()
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
187 linknode = attr.ib(default=None)
39231
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
188
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
189
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
190 @interfaceutil.implementer(repository.iverifyproblem)
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
191 @attr.s(frozen=True)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48928
diff changeset
192 class revlogproblem:
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
193 warning = attr.ib(default=None)
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
194 error = attr.ib(default=None)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
195 node = attr.ib(default=None)
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
196
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
197
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
198 def parse_index_v1(data, inline):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
199 # call the C implementation to parse the index data
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
200 index, cache = parsers.parse_index2(data, inline)
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
201 return index, cache
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
202
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
203
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
204 def parse_index_v2(data, inline):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
205 # call the C implementation to parse the index data
48769
1bb62821f080 revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents: 48765
diff changeset
206 index, cache = parsers.parse_index2(data, inline, format=REVLOGV2)
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
207 return index, cache
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
208
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
209
47270
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
210 def parse_index_cl_v2(data, inline):
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
211 # call the C implementation to parse the index data
48769
1bb62821f080 revlog: register changelogv2 C implementation in parsers
pacien <pacien.trangirard@pacien.net>
parents: 48765
diff changeset
212 index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2)
47270
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
213 return index, cache
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
214
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
215
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50811
diff changeset
216 if hasattr(parsers, 'parse_index_devel_nodemap'):
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
217
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
218 def parse_index_v1_nodemap(data, inline):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
219 index, cache = parsers.parse_index_devel_nodemap(data, inline)
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
220 return index, cache
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
221
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
222
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
223 else:
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
224 parse_index_v1_nodemap = None
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
225
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
226
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
227 def parse_index_v1_mixed(data, inline):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
228 index, cache = parse_index_v1(data, inline)
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
229 return rustrevlog.MixedIndex(index), cache
4972
8d0cf46e0dc6 revlog: add revlogio interface
Matt Mackall <mpm@selenic.com>
parents: 4971
diff changeset
230
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
231
25410
eee88912db0a revlog: raise an exception earlier if an entry is too large (issue4675)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 25361
diff changeset
232 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte
eee88912db0a revlog: raise an exception earlier if an entry is too large (issue4675)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 25361
diff changeset
233 # signed integer)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
234 _maxentrysize = 0x7FFFFFFF
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
235
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
236 FILE_TOO_SHORT_MSG = _(
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
237 b'cannot read from revlog %s;'
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
238 b' expected %d bytes from offset %d, data size is %d'
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
239 )
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
240
49415
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
241 hexdigits = b'0123456789abcdefABCDEF'
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
242
25410
eee88912db0a revlog: raise an exception earlier if an entry is too large (issue4675)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 25361
diff changeset
243
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
244 class _Config:
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
245 def copy(self):
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
246 return self.__class__(**self.__dict__)
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
247
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
248
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
249 @attr.s()
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
250 class FeatureConfig(_Config):
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
251 """Hold configuration values about the available revlog features"""
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
252
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
253 # the default compression engine
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
254 compression_engine = attr.ib(default=b'zlib')
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
255 # compression engines options
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
256 compression_engine_options = attr.ib(default=attr.Factory(dict))
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
257
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
258 # can we use censor on this revlog
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
259 censorable = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
260 # does this revlog use the "side data" feature
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
261 has_side_data = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
262 # might remove rank configuration once the computation has no impact
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
263 compute_rank = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
264 # parent order is supposed to be semantically irrelevant, so we
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
265 # normally resort parents to ensure that the first parent is non-null,
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
266 # if there is a non-null parent at all.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
267 # filelog abuses the parent order as flag to mark some instances of
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
268 # meta-encoded files, so allow it to disable this behavior.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
269 canonical_parent_order = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
270 # can ellipsis commit be used
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
271 enable_ellipsis = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
272
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
273 def copy(self):
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
274 new = super().copy()
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
275 new.compression_engine_options = self.compression_engine_options.copy()
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
276 return new
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
277
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
278
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
279 @attr.s()
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
280 class DataConfig(_Config):
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
281 """Hold configuration value about how the revlog data are read"""
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
282
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
283 # should we try to open the "pending" version of the revlog
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
284 try_pending = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
285 # should we try to open the "splitted" version of the revlog
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
286 try_split = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
287 # When True, indexfile should be opened with checkambig=True at writing,
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
288 # to avoid file stat ambiguity.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
289 check_ambig = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
290
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
291 # If true, use mmap instead of reading to deal with large index
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
292 mmap_large_index = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
293 # how much data is large
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
294 mmap_index_threshold = attr.ib(default=None)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
295 # How much data to read and cache into the raw revlog data cache.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
296 chunk_cache_size = attr.ib(default=65536)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
297
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
298 # The size of the uncompressed cache compared to the largest revision seen.
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
299 uncompressed_cache_factor = attr.ib(default=None)
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
300
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
301 # The number of chunk cached
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
302 uncompressed_cache_count = attr.ib(default=None)
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
303
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
304 # Allow sparse reading of the revlog data
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
305 with_sparse_read = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
306 # minimal density of a sparse read chunk
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
307 sr_density_threshold = attr.ib(default=0.50)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
308 # minimal size of data we skip when performing sparse read
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
309 sr_min_gap_size = attr.ib(default=262144)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
310
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
311 # are delta encoded against arbitrary bases.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
312 generaldelta = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
313
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
314
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
315 @attr.s()
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
316 class DeltaConfig(_Config):
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
317 """Hold configuration value about how new delta are computed
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
318
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
319 Some attributes are duplicated from DataConfig to help havign each object
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
320 self contained.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
321 """
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
322
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
323 # can delta be encoded against arbitrary bases.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
324 general_delta = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
325 # Allow sparse writing of the revlog data
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
326 sparse_revlog = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
327 # maximum length of a delta chain
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
328 max_chain_len = attr.ib(default=None)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
329 # Maximum distance between delta chain base start and end
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
330 max_deltachain_span = attr.ib(default=-1)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
331 # If `upper_bound_comp` is not None, this is the expected maximal gain from
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
332 # compression for the data content.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
333 upper_bound_comp = attr.ib(default=None)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
334 # Should we try a delta against both parent
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
335 delta_both_parents = attr.ib(default=True)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
336 # Test delta base candidate group by chunk of this maximal size.
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
337 candidate_group_chunk_size = attr.ib(default=0)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
338 # Should we display debug information about delta computation
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
339 debug_delta = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
340 # trust incoming delta by default
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
341 lazy_delta = attr.ib(default=True)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
342 # trust the base of incoming delta by default
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
343 lazy_delta_base = attr.ib(default=False)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
344
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
345
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
346 class _InnerRevlog:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
347 """An inner layer of the revlog object
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
348
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
349 That layer exist to be able to delegate some operation to Rust, its
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
350 boundaries are arbitrary and based on what we can delegate to Rust.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
351 """
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
352
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
353 def __init__(
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
354 self,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
355 opener,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
356 index,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
357 index_file,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
358 data_file,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
359 sidedata_file,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
360 inline,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
361 data_config,
51090
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
362 delta_config,
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
363 feature_config,
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
364 chunk_cache,
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
365 default_compression_header,
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
366 ):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
367 self.opener = opener
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
368 self.index = index
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
369
51086
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
370 self.__index_file = index_file
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
371 self.data_file = data_file
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
372 self.sidedata_file = sidedata_file
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
373 self.inline = inline
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
374 self.data_config = data_config
51090
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
375 self.delta_config = delta_config
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
376 self.feature_config = feature_config
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
377
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
378 # used during diverted write.
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
379 self._orig_index_file = None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
380
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
381 self._default_compression_header = default_compression_header
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
382
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
383 # index
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
384
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
385 # 3-tuple of file handles being used for active writing.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
386 self._writinghandles = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
387
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
388 self._segmentfile = randomaccessfile.randomaccessfile(
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
389 self.opener,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
390 (self.index_file if self.inline else self.data_file),
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
391 self.data_config.chunk_cache_size,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
392 chunk_cache,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
393 )
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
394 self._segmentfile_sidedata = randomaccessfile.randomaccessfile(
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
395 self.opener,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
396 self.sidedata_file,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
397 self.data_config.chunk_cache_size,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
398 )
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
399
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
400 # revlog header -> revlog compressor
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
401 self._decompressors = {}
51093
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
402 # 3-tuple of (node, rev, text) for a raw revision.
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
403 self._revisioncache = None
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
404
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
405 # cache some uncompressed chunks
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
406 # rev → uncompressed_chunk
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
407 #
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
408 # the max cost is dynamically updated to be proportionnal to the
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
409 # size of revision we actually encounter.
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
410 self._uncompressed_chunk_cache = None
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
411 if self.data_config.uncompressed_cache_factor is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
412 self._uncompressed_chunk_cache = util.lrucachedict(
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
413 self.data_config.uncompressed_cache_count,
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
414 maxcost=65536, # some arbitrary initial value
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
415 )
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
416
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
417 self._delay_buffer = None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
418
51086
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
419 @property
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
420 def index_file(self):
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
421 return self.__index_file
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
422
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
423 @index_file.setter
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
424 def index_file(self, new_index_file):
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
425 self.__index_file = new_index_file
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
426 if self.inline:
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
427 self._segmentfile.filename = new_index_file
c2c24b6b97f5 revlog: synchronise the various attribute holding the index filename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51085
diff changeset
428
51090
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
429 def __len__(self):
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
430 return len(self.index)
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
431
51098
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
432 def clear_cache(self):
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
433 assert not self.is_delaying
51098
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
434 self._revisioncache = None
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
435 if self._uncompressed_chunk_cache is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
436 self._uncompressed_chunk_cache.clear()
51098
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
437 self._segmentfile.clear_cache()
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
438 self._segmentfile_sidedata.clear_cache()
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
439
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
440 @property
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
441 def canonical_index_file(self):
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
442 if self._orig_index_file is not None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
443 return self._orig_index_file
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
444 return self.index_file
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
445
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
446 @property
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
447 def is_delaying(self):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
448 """is the revlog is currently delaying the visibility of written data?
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
449
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
450 The delaying mechanism can be either in-memory or written on disk in a
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
451 side-file."""
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
452 return (self._delay_buffer is not None) or (
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
453 self._orig_index_file is not None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
454 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
455
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
456 # Derived from index values.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
457
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
458 def start(self, rev):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
459 """the offset of the data chunk for this revision"""
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
460 return int(self.index[rev][0] >> 16)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
461
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
462 def length(self, rev):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
463 """the length of the data chunk for this revision"""
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
464 return self.index[rev][1]
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
465
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
466 def end(self, rev):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
467 """the end of the data chunk for this revision"""
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
468 return self.start(rev) + self.length(rev)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
469
51090
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
470 def deltaparent(self, rev):
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
471 """return deltaparent of the given revision"""
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
472 base = self.index[rev][3]
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
473 if base == rev:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
474 return nullrev
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
475 elif self.delta_config.general_delta:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
476 return base
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
477 else:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
478 return rev - 1
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
479
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
480 def issnapshot(self, rev):
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
481 """tells whether rev is a snapshot"""
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
482 if not self.delta_config.sparse_revlog:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
483 return self.deltaparent(rev) == nullrev
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
484 elif hasattr(self.index, 'issnapshot'):
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
485 # directly assign the method to cache the testing and access
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
486 self.issnapshot = self.index.issnapshot
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
487 return self.issnapshot(rev)
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
488 if rev == nullrev:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
489 return True
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
490 entry = self.index[rev]
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
491 base = entry[3]
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
492 if base == rev:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
493 return True
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
494 if base == nullrev:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
495 return True
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
496 p1 = entry[5]
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
497 while self.length(p1) == 0:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
498 b = self.deltaparent(p1)
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
499 if b == p1:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
500 break
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
501 p1 = b
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
502 p2 = entry[6]
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
503 while self.length(p2) == 0:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
504 b = self.deltaparent(p2)
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
505 if b == p2:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
506 break
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
507 p2 = b
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
508 if base == p1 or base == p2:
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
509 return False
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
510 return self.issnapshot(base)
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
511
51092
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
512 def _deltachain(self, rev, stoprev=None):
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
513 """Obtain the delta chain for a revision.
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
514
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
515 ``stoprev`` specifies a revision to stop at. If not specified, we
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
516 stop at the base of the chain.
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
517
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
518 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
519 revs in ascending order and ``stopped`` is a bool indicating whether
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
520 ``stoprev`` was hit.
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
521 """
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
522 generaldelta = self.delta_config.general_delta
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
523 # Try C implementation.
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
524 try:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
525 return self.index.deltachain(rev, stoprev, generaldelta)
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
526 except AttributeError:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
527 pass
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
528
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
529 chain = []
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
530
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
531 # Alias to prevent attribute lookup in tight loop.
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
532 index = self.index
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
533
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
534 iterrev = rev
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
535 e = index[iterrev]
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
536 while iterrev != e[3] and iterrev != stoprev:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
537 chain.append(iterrev)
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
538 if generaldelta:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
539 iterrev = e[3]
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
540 else:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
541 iterrev -= 1
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
542 e = index[iterrev]
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
543
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
544 if iterrev == stoprev:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
545 stopped = True
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
546 else:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
547 chain.append(iterrev)
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
548 stopped = False
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
549
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
550 chain.reverse()
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
551 return chain, stopped
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
552
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
553 @util.propertycache
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
554 def _compressor(self):
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
555 engine = util.compengines[self.feature_config.compression_engine]
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
556 return engine.revlogcompressor(
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
557 self.feature_config.compression_engine_options
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
558 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
559
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
560 @util.propertycache
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
561 def _decompressor(self):
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
562 """the default decompressor"""
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
563 if self._default_compression_header is None:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
564 return None
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
565 t = self._default_compression_header
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
566 c = self._get_decompressor(t)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
567 return c.decompress
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
568
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
569 def _get_decompressor(self, t):
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
570 try:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
571 compressor = self._decompressors[t]
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
572 except KeyError:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
573 try:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
574 engine = util.compengines.forrevlogheader(t)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
575 compressor = engine.revlogcompressor(
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
576 self.feature_config.compression_engine_options
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
577 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
578 self._decompressors[t] = compressor
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
579 except KeyError:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
580 raise error.RevlogError(
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
581 _(b'unknown compression type %s') % binascii.hexlify(t)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
582 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
583 return compressor
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
584
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
585 def compress(self, data):
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
586 """Generate a possibly-compressed representation of data."""
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
587 if not data:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
588 return b'', data
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
589
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
590 compressed = self._compressor.compress(data)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
591
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
592 if compressed:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
593 # The revlog compressor added the header in the returned data.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
594 return b'', compressed
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
595
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
596 if data[0:1] == b'\0':
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
597 return b'', data
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
598 return b'u', data
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
599
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
600 def decompress(self, data):
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
601 """Decompress a revlog chunk.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
602
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
603 The chunk is expected to begin with a header identifying the
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
604 format type so it can be routed to an appropriate decompressor.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
605 """
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
606 if not data:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
607 return data
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
608
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
609 # Revlogs are read much more frequently than they are written and many
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
610 # chunks only take microseconds to decompress, so performance is
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
611 # important here.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
612 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
613 # We can make a few assumptions about revlogs:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
614 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
615 # 1) the majority of chunks will be compressed (as opposed to inline
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
616 # raw data).
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
617 # 2) decompressing *any* data will likely by at least 10x slower than
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
618 # returning raw inline data.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
619 # 3) we want to prioritize common and officially supported compression
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
620 # engines
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
621 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
622 # It follows that we want to optimize for "decompress compressed data
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
623 # when encoded with common and officially supported compression engines"
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
624 # case over "raw data" and "data encoded by less common or non-official
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
625 # compression engines." That is why we have the inline lookup first
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
626 # followed by the compengines lookup.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
627 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
628 # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
629 # compressed chunks. And this matters for changelog and manifest reads.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
630 t = data[0:1]
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
631
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
632 if t == b'x':
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
633 try:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
634 return _zlibdecompress(data)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
635 except zlib.error as e:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
636 raise error.RevlogError(
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
637 _(b'revlog decompress error: %s')
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
638 % stringutil.forcebytestr(e)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
639 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
640 # '\0' is more common than 'u' so it goes first.
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
641 elif t == b'\0':
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
642 return data
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
643 elif t == b'u':
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
644 return util.buffer(data, 1)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
645
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
646 compressor = self._get_decompressor(t)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
647
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
648 return compressor.decompress(data)
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
649
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
650 @contextlib.contextmanager
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
651 def reading(self):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
652 """Context manager that keeps data and sidedata files open for reading"""
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
653 if len(self.index) == 0:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
654 yield # nothing to be read
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
655 else:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
656 with self._segmentfile.reading():
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
657 with self._segmentfile_sidedata.reading():
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
658 yield
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
659
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
660 @property
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
661 def is_writing(self):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
662 """True is a writing context is open"""
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
663 return self._writinghandles is not None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
664
51099
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
665 @property
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
666 def is_open(self):
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
667 """True if any file handle is being held
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
668
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
669 Used for assert and debug in the python code"""
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
670 return self._segmentfile.is_open or self._segmentfile_sidedata.is_open
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
671
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
672 @contextlib.contextmanager
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
673 def writing(self, transaction, data_end=None, sidedata_end=None):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
674 """Open the revlog files for writing
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
675
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
676 Add content to a revlog should be done within such context.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
677 """
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
678 if self.is_writing:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
679 yield
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
680 else:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
681 ifh = dfh = sdfh = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
682 try:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
683 r = len(self.index)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
684 # opening the data file.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
685 dsize = 0
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
686 if r:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
687 dsize = self.end(r - 1)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
688 dfh = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
689 if not self.inline:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
690 try:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
691 dfh = self.opener(self.data_file, mode=b"r+")
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
692 if data_end is None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
693 dfh.seek(0, os.SEEK_END)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
694 else:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
695 dfh.seek(data_end, os.SEEK_SET)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
696 except FileNotFoundError:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
697 dfh = self.opener(self.data_file, mode=b"w+")
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
698 transaction.add(self.data_file, dsize)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
699 if self.sidedata_file is not None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
700 assert sidedata_end is not None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
701 # revlog-v2 does not inline, help Pytype
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
702 assert dfh is not None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
703 try:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
704 sdfh = self.opener(self.sidedata_file, mode=b"r+")
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
705 dfh.seek(sidedata_end, os.SEEK_SET)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
706 except FileNotFoundError:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
707 sdfh = self.opener(self.sidedata_file, mode=b"w+")
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
708 transaction.add(self.sidedata_file, sidedata_end)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
709
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
710 # opening the index file.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
711 isize = r * self.index.entry_size
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
712 ifh = self.__index_write_fp()
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
713 if self.inline:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
714 transaction.add(self.index_file, dsize + isize)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
715 else:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
716 transaction.add(self.index_file, isize)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
717 # exposing all file handle for writing.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
718 self._writinghandles = (ifh, dfh, sdfh)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
719 self._segmentfile.writing_handle = ifh if self.inline else dfh
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
720 self._segmentfile_sidedata.writing_handle = sdfh
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
721 yield
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
722 finally:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
723 self._writinghandles = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
724 self._segmentfile.writing_handle = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
725 self._segmentfile_sidedata.writing_handle = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
726 if dfh is not None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
727 dfh.close()
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
728 if sdfh is not None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
729 sdfh.close()
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
730 # closing the index file last to avoid exposing referent to
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
731 # potential unflushed data content.
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
732 if ifh is not None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
733 ifh.close()
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
734
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
735 def __index_write_fp(self, index_end=None):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
736 """internal method to open the index file for writing
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
737
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
738 You should not use this directly and use `_writing` instead
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
739 """
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
740 try:
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
741 if self._delay_buffer is None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
742 f = self.opener(
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
743 self.index_file,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
744 mode=b"r+",
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
745 checkambig=self.data_config.check_ambig,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
746 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
747 else:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
748 # check_ambig affect we way we open file for writing, however
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
749 # here, we do not actually open a file for writting as write
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
750 # will appened to a delay_buffer. So check_ambig is not
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
751 # meaningful and unneeded here.
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
752 f = randomaccessfile.appender(
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
753 self.opener, self.index_file, b"r+", self._delay_buffer
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
754 )
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
755 if index_end is None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
756 f.seek(0, os.SEEK_END)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
757 else:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
758 f.seek(index_end, os.SEEK_SET)
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
759 return f
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
760 except FileNotFoundError:
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
761 if self._delay_buffer is None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
762 return self.opener(
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
763 self.index_file,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
764 mode=b"w+",
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
765 checkambig=self.data_config.check_ambig,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
766 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
767 else:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
768 return randomaccessfile.appender(
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
769 self.opener, self.index_file, b"w+", self._delay_buffer
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
770 )
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
771
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
772 def __index_new_fp(self):
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
773 """internal method to create a new index file for writing
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
774
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
775 You should not use this unless you are upgrading from inline revlog
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
776 """
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
777 return self.opener(
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
778 self.index_file,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
779 mode=b"w",
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
780 checkambig=self.data_config.check_ambig,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
781 atomictemp=True,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
782 )
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
783
51087
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
784 def split_inline(self, tr, header, new_index_file_path=None):
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
785 """split the data of an inline revlog into an index and a data file"""
51161
962974a5d068 revlog: add one more assert about state of thing when splitting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51155
diff changeset
786 assert self._delay_buffer is None
51087
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
787 existing_handles = False
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
788 if self._writinghandles is not None:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
789 existing_handles = True
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
790 fp = self._writinghandles[0]
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
791 fp.flush()
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
792 fp.close()
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
793 # We can't use the cached file handle after close(). So prevent
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
794 # its usage.
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
795 self._writinghandles = None
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
796 self._segmentfile.writing_handle = None
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
797 # No need to deal with sidedata writing handle as it is only
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
798 # relevant with revlog-v2 which is never inline, not reaching
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
799 # this code
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
800
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
801 new_dfh = self.opener(self.data_file, mode=b"w+")
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
802 new_dfh.truncate(0) # drop any potentially existing data
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
803 try:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
804 with self.reading():
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
805 for r in range(len(self.index)):
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
806 new_dfh.write(self.get_segment_for_revs(r, r)[1])
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
807 new_dfh.flush()
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
808
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
809 if new_index_file_path is not None:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
810 self.index_file = new_index_file_path
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
811 with self.__index_new_fp() as fp:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
812 self.inline = False
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
813 for i in range(len(self.index)):
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
814 e = self.index.entry_binary(i)
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
815 if i == 0:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
816 packed_header = self.index.pack_header(header)
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
817 e = packed_header + e
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
818 fp.write(e)
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
819
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
820 # If we don't use side-write, the temp file replace the real
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
821 # index when we exit the context manager
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
822
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
823 self._segmentfile = randomaccessfile.randomaccessfile(
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
824 self.opener,
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
825 self.data_file,
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
826 self.data_config.chunk_cache_size,
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
827 )
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
828
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
829 if existing_handles:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
830 # switched from inline to conventional reopen the index
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
831 ifh = self.__index_write_fp()
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
832 self._writinghandles = (ifh, new_dfh, None)
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
833 self._segmentfile.writing_handle = new_dfh
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
834 new_dfh = None
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
835 # No need to deal with sidedata writing handle as it is only
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
836 # relevant with revlog-v2 which is never inline, not reaching
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
837 # this code
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
838 finally:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
839 if new_dfh is not None:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
840 new_dfh.close()
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
841 return self.index_file
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
842
51084
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
843 def get_segment_for_revs(self, startrev, endrev):
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
844 """Obtain a segment of raw data corresponding to a range of revisions.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
845
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
846 Accepts the start and end revisions and an optional already-open
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
847 file handle to be used for reading. If the file handle is read, its
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
848 seek position will not be preserved.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
849
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
850 Requests for data may be satisfied by a cache.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
851
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
852 Returns a 2-tuple of (offset, data) for the requested range of
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
853 revisions. Offset is the integer offset from the beginning of the
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
854 revlog and data is a str or buffer of the raw byte data.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
855
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
856 Callers will need to call ``self.start(rev)`` and ``self.length(rev)``
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
857 to determine where each revision's data begins and ends.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
858
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
859 API: we should consider making this a private part of the InnerRevlog
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
860 at some point.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
861 """
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
862 # Inlined self.start(startrev) & self.end(endrev) for perf reasons
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
863 # (functions are expensive).
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
864 index = self.index
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
865 istart = index[startrev]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
866 start = int(istart[0] >> 16)
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
867 if startrev == endrev:
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
868 end = start + istart[1]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
869 else:
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
870 iend = index[endrev]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
871 end = int(iend[0] >> 16) + iend[1]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
872
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
873 if self.inline:
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
874 start += (startrev + 1) * self.index.entry_size
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
875 end += (endrev + 1) * self.index.entry_size
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
876 length = end - start
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
877
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
878 return start, self._segmentfile.read_chunk(start, length)
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
879
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
880 def _chunk(self, rev):
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
881 """Obtain a single decompressed chunk for a revision.
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
882
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
883 Accepts an integer revision and an optional already-open file handle
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
884 to be used for reading. If used, the seek position of the file will not
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
885 be preserved.
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
886
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
887 Returns a str holding uncompressed data for the requested revision.
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
888 """
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
889 if self._uncompressed_chunk_cache is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
890 uncomp = self._uncompressed_chunk_cache.get(rev)
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
891 if uncomp is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
892 return uncomp
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
893
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
894 compression_mode = self.index[rev][10]
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
895 data = self.get_segment_for_revs(rev, rev)[1]
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
896 if compression_mode == COMP_MODE_PLAIN:
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
897 uncomp = data
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
898 elif compression_mode == COMP_MODE_DEFAULT:
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
899 uncomp = self._decompressor(data)
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
900 elif compression_mode == COMP_MODE_INLINE:
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
901 uncomp = self.decompress(data)
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
902 else:
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
903 msg = b'unknown compression mode %d'
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
904 msg %= compression_mode
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
905 raise error.RevlogError(msg)
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
906 if self._uncompressed_chunk_cache is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
907 self._uncompressed_chunk_cache.insert(rev, uncomp, cost=len(uncomp))
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
908 return uncomp
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
909
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
910 def _chunks(self, revs, targetsize=None):
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
911 """Obtain decompressed chunks for the specified revisions.
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
912
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
913 Accepts an iterable of numeric revisions that are assumed to be in
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
914 ascending order. Also accepts an optional already-open file handle
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
915 to be used for reading. If used, the seek position of the file will
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
916 not be preserved.
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
917
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
918 This function is similar to calling ``self._chunk()`` multiple times,
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
919 but is faster.
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
920
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
921 Returns a list with decompressed data for each requested revision.
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
922 """
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
923 if not revs:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
924 return []
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
925 start = self.start
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
926 length = self.length
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
927 inline = self.inline
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
928 iosize = self.index.entry_size
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
929 buffer = util.buffer
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
930
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
931 fetched_revs = []
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
932 fadd = fetched_revs.append
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
933
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
934 chunks = []
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
935 ladd = chunks.append
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
936
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
937 if self._uncompressed_chunk_cache is None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
938 fetched_revs = revs
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
939 else:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
940 for rev in revs:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
941 cached_value = self._uncompressed_chunk_cache.get(rev)
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
942 if cached_value is None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
943 fadd(rev)
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
944 else:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
945 ladd((rev, cached_value))
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
946
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
947 if not fetched_revs:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
948 slicedchunks = ()
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
949 elif not self.data_config.with_sparse_read:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
950 slicedchunks = (fetched_revs,)
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
951 else:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
952 slicedchunks = deltautil.slicechunk(
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
953 self,
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
954 fetched_revs,
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
955 targetsize=targetsize,
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
956 )
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
957
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
958 for revschunk in slicedchunks:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
959 firstrev = revschunk[0]
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
960 # Skip trailing revisions with empty diff
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
961 for lastrev in revschunk[::-1]:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
962 if length(lastrev) != 0:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
963 break
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
964
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
965 try:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
966 offset, data = self.get_segment_for_revs(firstrev, lastrev)
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
967 except OverflowError:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
968 # issue4215 - we can't cache a run of chunks greater than
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
969 # 2G on Windows
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
970 for rev in revschunk:
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
971 ladd((rev, self._chunk(rev)))
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
972
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
973 decomp = self.decompress
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
974 # self._decompressor might be None, but will not be used in that case
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
975 def_decomp = self._decompressor
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
976 for rev in revschunk:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
977 chunkstart = start(rev)
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
978 if inline:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
979 chunkstart += (rev + 1) * iosize
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
980 chunklength = length(rev)
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
981 comp_mode = self.index[rev][10]
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
982 c = buffer(data, chunkstart - offset, chunklength)
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
983 if comp_mode == COMP_MODE_PLAIN:
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
984 c = c
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
985 elif comp_mode == COMP_MODE_INLINE:
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
986 c = decomp(c)
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
987 elif comp_mode == COMP_MODE_DEFAULT:
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
988 c = def_decomp(c)
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
989 else:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
990 msg = b'unknown compression mode %d'
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
991 msg %= comp_mode
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
992 raise error.RevlogError(msg)
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
993 ladd((rev, c))
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
994 if self._uncompressed_chunk_cache is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
995 self._uncompressed_chunk_cache.insert(rev, c, len(c))
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
996
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
997 chunks.sort()
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
998 return [x[1] for x in chunks]
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
999
51094
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1000 def raw_text(self, node, rev):
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1001 """return the possibly unvalidated rawtext for a revision
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1002
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1003 returns (rev, rawtext, validated)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1004 """
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1005
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1006 # revision in the cache (could be useful to apply delta)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1007 cachedrev = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1008 # An intermediate text to apply deltas to
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1009 basetext = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1010
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1011 # Check if we have the entry in cache
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1012 # The cache entry looks like (node, rev, rawtext)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1013 if self._revisioncache:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1014 cachedrev = self._revisioncache[1]
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1015
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1016 chain, stopped = self._deltachain(rev, stoprev=cachedrev)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1017 if stopped:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1018 basetext = self._revisioncache[2]
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1019
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1020 # drop cache to save memory, the caller is expected to
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1021 # update self._inner._revisioncache after validating the text
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1022 self._revisioncache = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1023
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1024 targetsize = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1025 rawsize = self.index[rev][2]
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1026 if 0 <= rawsize:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1027 targetsize = 4 * rawsize
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1028
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1029 if self._uncompressed_chunk_cache is not None:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1030 # dynamically update the uncompressed_chunk_cache size to the
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1031 # largest revision we saw in this revlog.
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1032 factor = self.data_config.uncompressed_cache_factor
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1033 candidate_size = rawsize * factor
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1034 if candidate_size > self._uncompressed_chunk_cache.maxcost:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1035 self._uncompressed_chunk_cache.maxcost = candidate_size
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1036
51094
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1037 bins = self._chunks(chain, targetsize=targetsize)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1038 if basetext is None:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1039 basetext = bytes(bins[0])
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1040 bins = bins[1:]
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1041
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1042 rawtext = mdiff.patches(basetext, bins)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1043 del basetext # let us have a chance to free memory early
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1044 return (rev, rawtext, False)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1045
51095
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1046 def sidedata(self, rev, sidedata_end):
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1047 """Return the sidedata for a given revision number."""
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1048 index_entry = self.index[rev]
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1049 sidedata_offset = index_entry[8]
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1050 sidedata_size = index_entry[9]
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1051
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1052 if self.inline:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1053 sidedata_offset += self.index.entry_size * (1 + rev)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1054 if sidedata_size == 0:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1055 return {}
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1056
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1057 if sidedata_end < sidedata_offset + sidedata_size:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1058 filename = self.sidedata_file
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1059 end = sidedata_end
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1060 offset = sidedata_offset
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1061 length = sidedata_size
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1062 m = FILE_TOO_SHORT_MSG % (filename, length, offset, end)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1063 raise error.RevlogError(m)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1064
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1065 comp_segment = self._segmentfile_sidedata.read_chunk(
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1066 sidedata_offset, sidedata_size
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1067 )
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1068
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1069 comp = self.index[rev][11]
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1070 if comp == COMP_MODE_PLAIN:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1071 segment = comp_segment
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1072 elif comp == COMP_MODE_DEFAULT:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1073 segment = self._decompressor(comp_segment)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1074 elif comp == COMP_MODE_INLINE:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1075 segment = self.decompress(comp_segment)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1076 else:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1077 msg = b'unknown compression mode %d'
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1078 msg %= comp
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1079 raise error.RevlogError(msg)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1080
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1081 sidedata = sidedatautil.deserialize_sidedata(segment)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1082 return sidedata
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1083
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1084 def write_entry(
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1085 self,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1086 transaction,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1087 entry,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1088 data,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1089 link,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1090 offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1091 sidedata,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1092 sidedata_offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1093 index_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1094 data_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1095 sidedata_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1096 ):
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1097 # Files opened in a+ mode have inconsistent behavior on various
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1098 # platforms. Windows requires that a file positioning call be made
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1099 # when the file handle transitions between reads and writes. See
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1100 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1101 # platforms, Python or the platform itself can be buggy. Some versions
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1102 # of Solaris have been observed to not append at the end of the file
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1103 # if the file was seeked to before the end. See issue4943 for more.
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1104 #
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1105 # We work around this issue by inserting a seek() before writing.
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1106 # Note: This is likely not necessary on Python 3. However, because
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1107 # the file handle is reused for reads and may be seeked there, we need
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1108 # to be careful before changing this.
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1109 if self._writinghandles is None:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1110 msg = b'adding revision outside `revlog._writing` context'
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1111 raise error.ProgrammingError(msg)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1112 ifh, dfh, sdfh = self._writinghandles
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1113 if index_end is None:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1114 ifh.seek(0, os.SEEK_END)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1115 else:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1116 ifh.seek(index_end, os.SEEK_SET)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1117 if dfh:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1118 if data_end is None:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1119 dfh.seek(0, os.SEEK_END)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1120 else:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1121 dfh.seek(data_end, os.SEEK_SET)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1122 if sdfh:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1123 sdfh.seek(sidedata_end, os.SEEK_SET)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1124
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1125 curr = len(self.index) - 1
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1126 if not self.inline:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1127 transaction.add(self.data_file, offset)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1128 if self.sidedata_file:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1129 transaction.add(self.sidedata_file, sidedata_offset)
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
1130 transaction.add(self.canonical_index_file, curr * len(entry))
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1131 if data[0]:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1132 dfh.write(data[0])
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1133 dfh.write(data[1])
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1134 if sidedata:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1135 sdfh.write(sidedata)
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1136 if self._delay_buffer is None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1137 ifh.write(entry)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1138 else:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1139 self._delay_buffer.append(entry)
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1140 else:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1141 offset += curr * self.index.entry_size
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
1142 transaction.add(self.canonical_index_file, offset)
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1143 assert not sidedata
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1144 if self._delay_buffer is None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1145 ifh.write(entry)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1146 ifh.write(data[0])
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1147 ifh.write(data[1])
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1148 else:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1149 self._delay_buffer.append(entry)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1150 self._delay_buffer.append(data[0])
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1151 self._delay_buffer.append(data[1])
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1152 return (
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1153 ifh.tell(),
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1154 dfh.tell() if dfh else None,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1155 sdfh.tell() if sdfh else None,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1156 )
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1157
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1158 def _divert_index(self):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1159 return self.index_file + b'.a'
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1160
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1161 def delay(self):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1162 assert not self.is_open
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1163 if self._delay_buffer is not None or self._orig_index_file is not None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1164 # delay or divert already in place
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1165 return None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1166 elif len(self.index) == 0:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1167 self._orig_index_file = self.index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1168 self.index_file = self._divert_index()
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1169 self._segmentfile.filename = self.index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1170 assert self._orig_index_file is not None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1171 assert self.index_file is not None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1172 if self.opener.exists(self.index_file):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1173 self.opener.unlink(self.index_file)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1174 return self.index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1175 else:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1176 self._segmentfile._delay_buffer = self._delay_buffer = []
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1177 return None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1178
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1179 def write_pending(self):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1180 assert not self.is_open
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1181 if self._orig_index_file is not None:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1182 return None, True
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1183 any_pending = False
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1184 pending_index_file = self._divert_index()
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1185 if self.opener.exists(pending_index_file):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1186 self.opener.unlink(pending_index_file)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1187 util.copyfile(
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1188 self.opener.join(self.index_file),
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1189 self.opener.join(pending_index_file),
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1190 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1191 if self._delay_buffer:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1192 with self.opener(pending_index_file, b'r+') as ifh:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1193 ifh.seek(0, os.SEEK_END)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1194 ifh.write(b"".join(self._delay_buffer))
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1195 any_pending = True
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1196 self._segmentfile._delay_buffer = self._delay_buffer = None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1197 self._orig_index_file = self.index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1198 self.index_file = pending_index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1199 self._segmentfile.filename = self.index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1200 return self.index_file, any_pending
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1201
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1202 def finalize_pending(self):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1203 assert not self.is_open
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1204
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1205 delay = self._delay_buffer is not None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1206 divert = self._orig_index_file is not None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1207
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1208 if delay and divert:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1209 assert False, "unreachable"
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1210 elif delay:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1211 if self._delay_buffer:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1212 with self.opener(self.index_file, b'r+') as ifh:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1213 ifh.seek(0, os.SEEK_END)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1214 ifh.write(b"".join(self._delay_buffer))
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1215 self._segmentfile._delay_buffer = self._delay_buffer = None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1216 elif divert:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1217 if self.opener.exists(self.index_file):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1218 self.opener.rename(
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1219 self.index_file,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1220 self._orig_index_file,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1221 checkambig=True,
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1222 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1223 self.index_file = self._orig_index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1224 self._orig_index_file = None
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1225 self._segmentfile.filename = self.index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1226 else:
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1227 msg = b"not delay or divert found on this revlog"
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1228 raise error.ProgrammingError(msg)
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1229 return self.canonical_index_file
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1230
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1231
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48928
diff changeset
1232 class revlog:
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1233 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1234 the underlying revision storage object
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1235
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1236 A revlog consists of two parts, an index and the revision data.
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1237
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1238 The index is a file with a fixed record size containing
6912
b92baef99ebf Fixed docstring typos
Martin Geisler <mg@daimi.au.dk>
parents: 6891
diff changeset
1239 information on each revision, including its nodeid (hash), the
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1240 nodeids of its parents, the position and offset of its data within
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1241 the data file, and the revision it's based on. Finally, each entry
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1242 contains a linkrev entry that can serve as a pointer to external
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1243 data.
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1244
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1245 The revision data itself is a linear collection of data chunks.
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1246 Each chunk represents a revision and is usually represented as a
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1247 delta against the previous chunk. To bound lookup time, runs of
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1248 deltas are limited to about 2 times the length of the original
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1249 version data. This makes retrieval of a version proportional to
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1250 its size, or O(1) relative to the number of revisions.
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1251
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1252 Both pieces of the revlog are written to in an append-only
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1253 fashion, which means we never need to rewrite a file to insert or
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1254 remove data, and can use some simple techniques to avoid the need
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1255 for locking while reading.
29997
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
1256
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
1257 If checkambig, indexfile is opened with checkambig=True at
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
1258 writing, to avoid file stat ambiguity.
34296
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
1259
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
1260 If mmaplargeindex is True, and an mmapindexthreshold is set, the
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
1261 index will be mmapped rather than read if it is larger than the
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
1262 configured threshold.
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1263
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1264 If censorable is True, the revlog can have censored revisions.
42462
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42452
diff changeset
1265
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42452
diff changeset
1266 If `upperboundcomp` is not None, this is the expected maximal gain from
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42452
diff changeset
1267 compression for the data content.
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1268
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1269 `concurrencychecker` is an optional function that receives 3 arguments: a
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1270 file handle, a filename, and an expected position. It should check whether
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1271 the current position in the file handle is valid, and log/warn/fail (by
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1272 raising).
47246
02a4463565ea revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47245
diff changeset
1273
47393
7a0ec25d5836 revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47391
diff changeset
1274 See mercurial/revlogutils/contants.py for details about the content of an
7a0ec25d5836 revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47391
diff changeset
1275 index entry.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1276 """
42994
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
1277
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
1278 _flagserrorclass = error.RevlogError
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
1279
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1280 @staticmethod
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1281 def is_inline_index(header_bytes):
50999
4ea606568f61 revlog: document the `is_inline_index` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
1282 """Determine if a revlog is inline from the initial bytes of the index"""
51074
74c004a515bc stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50811
diff changeset
1283 if len(header_bytes) == 0:
74c004a515bc stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50811
diff changeset
1284 return True
74c004a515bc stream-clone: fix a crash when a repo with an empty revlog is cloned
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50811
diff changeset
1285
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1286 header = INDEX_HEADER.unpack(header_bytes)[0]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1287
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1288 _format_flags = header & ~0xFFFF
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1289 _format_version = header & 0xFFFF
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1290
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1291 features = FEATURES_BY_VERSION[_format_version]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1292 return features[b'inline'](_format_flags)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1294 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1295 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1296 opener,
47072
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1297 target,
47150
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1298 radix,
47240
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1299 postfix=None, # only exist for `tmpcensored` now
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1300 checkambig=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1301 mmaplargeindex=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1302 censorable=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1303 upperboundcomp=None,
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
1304 persistentnodemap=False,
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1305 concurrencychecker=None,
47240
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1306 trypending=False,
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
1307 try_split=False,
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1308 canonical_parent_order=True,
51154
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1309 data_config=None,
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1310 delta_config=None,
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1311 feature_config=None,
51155
e9eac01c57f3 revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51154
diff changeset
1312 may_inline=True, # may inline new revlog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1313 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1314 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1315 create a revlog object
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1316
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1317 opener is a function that abstracts the file opening operation
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1318 and can be used to implement COW semantics or the like.
42462
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42452
diff changeset
1319
47072
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1320 `target`: a (KIND, ID) tuple that identify the content stored in
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1321 this revlog. It help the rest of the code to understand what the revlog
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1322 is about without having to resort to heuristic and index filename
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1323 analysis. Note: that this must be reliably be set by normal code, but
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1324 that test, debug, or performance measurement code might not set this to
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1325 accurate value.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1326 """
47150
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1327
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1328 self.radix = radix
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1329
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1330 self._docket_file = None
47168
cacb08f357ed revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47167
diff changeset
1331 self._indexfile = None
cacb08f357ed revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47167
diff changeset
1332 self._datafile = None
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1333 self._sidedatafile = None
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1334 self._nodemap_file = None
47145
c6b8d5d91e73 revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47144
diff changeset
1335 self.postfix = postfix
47240
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1336 self._trypending = trypending
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
1337 self._try_split = try_split
51155
e9eac01c57f3 revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51154
diff changeset
1338 self._may_inline = may_inline
47151
24be247a13b4 revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47150
diff changeset
1339 self.opener = opener
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
1340 if persistentnodemap:
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1341 self._nodemap_file = nodemaputil.get_nodemap_file(self)
47151
24be247a13b4 revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47150
diff changeset
1342
47072
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1343 assert target[0] in ALL_KINDS
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1344 assert len(target) == 2
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
1345 self.target = target
51154
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1346 if feature_config is not None:
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1347 self.feature_config = feature_config.copy()
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1348 elif b'feature-config' in self.opener.options:
51028
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1349 self.feature_config = self.opener.options[b'feature-config'].copy()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1350 else:
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1351 self.feature_config = FeatureConfig()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1352 self.feature_config.censorable = censorable
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1353 self.feature_config.canonical_parent_order = canonical_parent_order
51154
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1354 if data_config is not None:
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1355 self.data_config = data_config.copy()
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1356 elif b'data-config' in self.opener.options:
51028
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1357 self.data_config = self.opener.options[b'data-config'].copy()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1358 else:
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1359 self.data_config = DataConfig()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1360 self.data_config.check_ambig = checkambig
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1361 self.data_config.mmap_large_index = mmaplargeindex
51154
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1362 if delta_config is not None:
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1363 self.delta_config = delta_config.copy()
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1364 elif b'delta-config' in self.opener.options:
51028
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1365 self.delta_config = self.opener.options[b'delta-config'].copy()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1366 else:
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1367 self.delta_config = DeltaConfig()
51080
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1368 self.delta_config.upper_bound_comp = upperboundcomp
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1369
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
1370 # Maps rev to chain base rev.
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
1371 self._chainbasecache = util.lrucachedict(100)
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1372
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
1373 self.index = None
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1374 self._docket = None
44323
76a96e3a2bbb nodemap: keep track of the docket for loaded data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44320
diff changeset
1375 self._nodemap_docket = None
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1376 # 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
1377 self._pcache = {}
4985
e6525e459157 revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents: 4984
diff changeset
1378
49663
45d7b8c380d7 changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49657
diff changeset
1379 # other optionnals features
45d7b8c380d7 changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49657
diff changeset
1380
39768
7b2b42fc377a revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39767
diff changeset
1381 # Make copy of flag processors so each revlog instance can support
7b2b42fc377a revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39767
diff changeset
1382 # custom flags.
42729
05c80f9ef100 flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42728
diff changeset
1383 self._flagprocessors = dict(flagutil.flagprocessors)
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
1384 # prevent nesting of addgroup
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
1385 self._adding_group = None
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
1386
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1387 chunk_cache = self._loadindex()
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1388 self._load_inner(chunk_cache)
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1389 self._concurrencychecker = concurrencychecker
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1390
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1391 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1392 def _generaldelta(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1393 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1394 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1395 b"use revlog.delta_config.general_delta", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1396 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1397 return self.delta_config.general_delta
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1398
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1399 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1400 def _checkambig(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1401 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1402 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1403 b"use revlog.data_config.checkambig", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1404 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1405 return self.data_config.check_ambig
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1406
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1407 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1408 def _mmaplargeindex(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1409 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1410 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1411 b"use revlog.data_config.mmap_large_index", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1412 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1413 return self.data_config.mmap_large_index
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1414
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1415 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1416 def _censorable(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1417 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1418 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1419 b"use revlog.feature_config.censorable", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1420 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1421 return self.feature_config.censorable
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1422
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1423 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1424 def _chunkcachesize(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1425 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1426 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1427 b"use revlog.data_config.chunk_cache_size", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1428 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1429 return self.data_config.chunk_cache_size
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1430
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1431 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1432 def _maxchainlen(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1433 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1434 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1435 b"use revlog.delta_config.max_chain_len", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1436 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1437 return self.delta_config.max_chain_len
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1438
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1439 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1440 def _deltabothparents(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1441 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1442 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1443 b"use revlog.delta_config.delta_both_parents", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1444 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1445 return self.delta_config.delta_both_parents
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1446
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1447 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1448 def _candidate_group_chunk_size(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1449 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1450 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1451 b"use revlog.delta_config.candidate_group_chunk_size",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1452 b"6.6",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1453 stacklevel=2,
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1454 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1455 return self.delta_config.candidate_group_chunk_size
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1456
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1457 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1458 def _debug_delta(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1459 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1460 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1461 b"use revlog.delta_config.debug_delta", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1462 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1463 return self.delta_config.debug_delta
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1464
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1465 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1466 def _compengine(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1467 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1468 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1469 b"use revlog.feature_config.compression_engine",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1470 b"6.6",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1471 stacklevel=2,
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1472 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1473 return self.feature_config.compression_engine
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1474
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1475 @property
51080
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1476 def upperboundcomp(self):
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1477 """temporary compatibility proxy"""
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1478 util.nouideprecwarn(
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1479 b"use revlog.delta_config.upper_bound_comp",
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1480 b"6.6",
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1481 stacklevel=2,
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1482 )
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1483 return self.delta_config.upper_bound_comp
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1484
5645524c6b62 revlog: also migrates `revlog.upperboundcomp` to ConfigClass
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51079
diff changeset
1485 @property
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1486 def _compengineopts(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1487 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1488 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1489 b"use revlog.feature_config.compression_engine_options",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1490 b"6.6",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1491 stacklevel=2,
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1492 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1493 return self.feature_config.compression_engine_options
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1494
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1495 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1496 def _maxdeltachainspan(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1497 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1498 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1499 b"use revlog.delta_config.max_deltachain_span", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1500 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1501 return self.delta_config.max_deltachain_span
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1502
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1503 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1504 def _withsparseread(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1505 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1506 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1507 b"use revlog.data_config.with_sparse_read", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1508 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1509 return self.data_config.with_sparse_read
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1510
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1511 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1512 def _sparserevlog(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1513 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1514 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1515 b"use revlog.delta_config.sparse_revlog", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1516 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1517 return self.delta_config.sparse_revlog
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1518
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1519 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1520 def hassidedata(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1521 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1522 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1523 b"use revlog.feature_config.has_side_data", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1524 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1525 return self.feature_config.has_side_data
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1526
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1527 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1528 def _srdensitythreshold(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1529 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1530 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1531 b"use revlog.data_config.sr_density_threshold",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1532 b"6.6",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1533 stacklevel=2,
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1534 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1535 return self.data_config.sr_density_threshold
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1536
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1537 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1538 def _srmingapsize(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1539 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1540 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1541 b"use revlog.data_config.sr_min_gap_size", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1542 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1543 return self.data_config.sr_min_gap_size
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1544
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1545 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1546 def _compute_rank(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1547 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1548 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1549 b"use revlog.feature_config.compute_rank", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1550 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1551 return self.feature_config.compute_rank
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1552
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1553 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1554 def canonical_parent_order(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1555 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1556 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1557 b"use revlog.feature_config.canonical_parent_order",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1558 b"6.6",
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1559 stacklevel=2,
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1560 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1561 return self.feature_config.canonical_parent_order
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1562
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1563 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1564 def _lazydelta(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1565 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1566 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1567 b"use revlog.delta_config.lazy_delta", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1568 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1569 return self.delta_config.lazy_delta
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1570
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1571 @property
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1572 def _lazydeltabase(self):
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1573 """temporary compatibility proxy"""
51065
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1574 util.nouideprecwarn(
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1575 b"use revlog.delta_config.lazy_delta_base", b"6.6", stacklevel=2
41c73325af52 revlog: deprecate the compatibility config property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51063
diff changeset
1576 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1577 return self.delta_config.lazy_delta_base
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1578
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1579 def _init_opts(self):
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1580 """process options (from above/config) to setup associated default revlog mode
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1581
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1582 These values might be affected when actually reading on disk information.
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1583
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1584 The relevant values are returned for use in _loadindex().
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1585
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1586 * newversionflags:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1587 version header to use if we need to create a new revlog
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1588
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1589 * mmapindexthreshold:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1590 minimal index size for start to use mmap
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1591
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1592 * force_nodemap:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1593 force the usage of a "development" version of the nodemap code
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1594 """
43025
3518da504303 vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
1595 opts = self.opener.options
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1596
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
1597 if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG:
47266
921648d31553 changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47263
diff changeset
1598 new_header = CHANGELOGV2
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1599 compute_rank = opts.get(b'changelogv2.compute-rank', True)
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1600 self.feature_config.compute_rank = compute_rank
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
1601 elif b'revlogv2' in opts:
47261
80164d50ae3d revlogv2: no longer attempt to use inline for new revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47259
diff changeset
1602 new_header = REVLOGV2
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1603 elif b'revlogv1' in opts:
51155
e9eac01c57f3 revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51154
diff changeset
1604 new_header = REVLOGV1
e9eac01c57f3 revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51154
diff changeset
1605 if self._may_inline:
e9eac01c57f3 revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51154
diff changeset
1606 new_header |= FLAG_INLINE_DATA
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1607 if b'generaldelta' in opts:
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1608 new_header |= FLAG_GENERALDELTA
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1609 elif b'revlogv0' in self.opener.options:
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1610 new_header = REVLOGV0
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1611 else:
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1612 new_header = REVLOG_DEFAULT_VERSION
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1613
51039
027bc364524b revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51038
diff changeset
1614 mmapindexthreshold = None
51046
3977068c638c revlog: remove legacy usage of `_mmaplargeindex`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51045
diff changeset
1615 if self.data_config.mmap_large_index:
51039
027bc364524b revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51038
diff changeset
1616 mmapindexthreshold = self.data_config.mmap_index_threshold
51038
683b96c416d8 revlog: skip opener options to pass enable_ellipsis
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51037
diff changeset
1617 if self.feature_config.enable_ellipsis:
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1618 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1619
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1620 # revlog v0 doesn't have flag processors
48928
ceafb0f81250 revlog: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
1621 for flag, processor in opts.get(b'flagprocessors', {}).items():
42731
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
1622 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
1623
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1624 chunk_cache_size = self.data_config.chunk_cache_size
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1625 if chunk_cache_size <= 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1626 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
1627 _(b'revlog chunk cache size %r is not greater than 0')
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1628 % chunk_cache_size
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1629 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1630 elif chunk_cache_size & (chunk_cache_size - 1):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1631 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
1632 _(b'revlog chunk cache size %r is not a power of 2')
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1633 % chunk_cache_size
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1634 )
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1635 force_nodemap = opts.get(b'devel-force-nodemap', False)
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1636 return new_header, mmapindexthreshold, force_nodemap
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1637
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1638 def _get_data(self, filepath, mmap_threshold, size=None):
47169
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1639 """return a file content with or without mmap
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1640
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1641 If the file is missing return the empty string"""
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1642 try:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1643 with self.opener(filepath) as fp:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1644 if mmap_threshold is not None:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1645 file_size = self.opener.fstat(fp).st_size
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1646 if file_size >= mmap_threshold:
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1647 if size is not None:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1648 # avoid potentiel mmap crash
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1649 size = min(file_size, size)
47169
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1650 # TODO: should .close() to release resources without
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1651 # relying on Python GC
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1652 if size is None:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1653 return util.buffer(util.mmapread(fp))
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1654 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1655 return util.buffer(util.mmapread(fp, size))
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1656 if size is None:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1657 return fp.read()
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1658 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1659 return fp.read(size)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
1660 except FileNotFoundError:
47169
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1661 return b''
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1662
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1663 def get_streams(self, max_linkrev, force_inline=False):
51000
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1664 """return a list of streams that represent this revlog
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1665
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1666 This is used by stream-clone to do bytes to bytes copies of a repository.
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1667
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1668 This streams data for all revisions that refer to a changelog revision up
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1669 to `max_linkrev`.
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1670
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1671 If `force_inline` is set, it enforces that the stream will represent an inline revlog.
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1672
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1673 It returns is a list of three-tuple:
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1674
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1675 [
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1676 (filename, bytes_stream, stream_size),
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1677 …
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1678 ]
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1679 """
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1680 n = len(self)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1681 index = self.index
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1682 while n > 0:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1683 linkrev = index[n - 1][4]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1684 if linkrev < max_linkrev:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1685 break
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1686 # note: this loop will rarely go through multiple iterations, since
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1687 # it only traverses commits created during the current streaming
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1688 # pull operation.
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1689 #
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1690 # If this become a problem, using a binary search should cap the
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1691 # runtime of this.
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1692 n = n - 1
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1693 if n == 0:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1694 # no data to send
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1695 return []
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1696 index_size = n * index.entry_size
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1697 data_size = self.end(n - 1)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1698
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1699 # XXX we might have been split (or stripped) since the object
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1700 # initialization, We need to close this race too, but having a way to
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1701 # pre-open the file we feed to the revlog and never closing them before
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1702 # we are done streaming.
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1703
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1704 if self._inline:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1705
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1706 def get_stream():
51078
5ffee3cff8de revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51077
diff changeset
1707 with self.opener(self._indexfile, mode=b"r") as fp:
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1708 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1709 size = index_size + data_size
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1710 if size <= 65536:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1711 yield fp.read(size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1712 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1713 yield from util.filechunkiter(fp, limit=size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1714
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1715 inline_stream = get_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1716 next(inline_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1717 return [
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1718 (self._indexfile, inline_stream, index_size + data_size),
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1719 ]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1720 elif force_inline:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1721
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1722 def get_stream():
51015
720e5a5f2b95 stream-clone: use `revlog.reading` in `revlog.get_streams`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51013
diff changeset
1723 with self.reading():
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1724 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1725
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1726 for rev in range(n):
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1727 idx = self.index.entry_binary(rev)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1728 if rev == 0 and self._docket is None:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1729 # re-inject the inline flag
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1730 header = self._format_flags
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1731 header |= self._format_version
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1732 header |= FLAG_INLINE_DATA
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1733 header = self.index.pack_header(header)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1734 idx = header + idx
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1735 yield idx
51084
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
1736 yield self._inner.get_segment_for_revs(rev, rev)[1]
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1737
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1738 inline_stream = get_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1739 next(inline_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1740 return [
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1741 (self._indexfile, inline_stream, index_size + data_size),
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1742 ]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1743 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1744
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1745 def get_index_stream():
51078
5ffee3cff8de revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51077
diff changeset
1746 with self.opener(self._indexfile, mode=b"r") as fp:
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1747 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1748 if index_size <= 65536:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1749 yield fp.read(index_size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1750 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1751 yield from util.filechunkiter(fp, limit=index_size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1752
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1753 def get_data_stream():
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1754 with self._datafp() as fp:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1755 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1756 if data_size <= 65536:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1757 yield fp.read(data_size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1758 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1759 yield from util.filechunkiter(fp, limit=data_size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1760
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1761 index_stream = get_index_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1762 next(index_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1763 data_stream = get_data_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1764 next(data_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1765 return [
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1766 (self._datafile, data_stream, data_size),
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1767 (self._indexfile, index_stream, index_size),
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1768 ]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1769
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1770 def _loadindex(self, docket=None):
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1771
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1772 new_header, mmapindexthreshold, force_nodemap = self._init_opts()
47168
cacb08f357ed revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47167
diff changeset
1773
47240
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1774 if self.postfix is not None:
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1775 entry_point = b'%s.i.%s' % (self.radix, self.postfix)
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1776 elif self._trypending and self.opener.exists(b'%s.i.a' % self.radix):
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1777 entry_point = b'%s.i.a' % self.radix
50658
978ffa09910b revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50348
diff changeset
1778 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
1779 entry_point = self._split_index_file
47240
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
1780 else:
47175
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1781 entry_point = b'%s.i' % self.radix
47168
cacb08f357ed revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47167
diff changeset
1782
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1783 if docket is not None:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1784 self._docket = docket
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1785 self._docket_file = entry_point
47169
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1786 else:
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1787 self._initempty = True
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1788 entry_data = self._get_data(entry_point, mmapindexthreshold)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1789 if len(entry_data) > 0:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1790 header = INDEX_HEADER.unpack(entry_data[:4])[0]
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1791 self._initempty = False
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1792 else:
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1793 header = new_header
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1794
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1795 self._format_flags = header & ~0xFFFF
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1796 self._format_version = header & 0xFFFF
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1797
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1798 supported_flags = SUPPORTED_FLAGS.get(self._format_version)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1799 if supported_flags is None:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1800 msg = _(b'unknown version (%d) in revlog %s')
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1801 msg %= (self._format_version, self.display_id)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1802 raise error.RevlogError(msg)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1803 elif self._format_flags & ~supported_flags:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1804 msg = _(b'unknown flags (%#04x) in version %d revlog %s')
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1805 display_flag = self._format_flags >> 16
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1806 msg %= (display_flag, self._format_version, self.display_id)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1807 raise error.RevlogError(msg)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1808
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1809 features = FEATURES_BY_VERSION[self._format_version]
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1810 self._inline = features[b'inline'](self._format_flags)
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1811 self.delta_config.general_delta = features[b'generaldelta'](
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1812 self._format_flags
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1813 )
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1814 self.feature_config.has_side_data = features[b'sidedata']
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1815
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1816 if not features[b'docket']:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1817 self._indexfile = entry_point
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1818 index_data = entry_data
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1819 else:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1820 self._docket_file = entry_point
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1821 if self._initempty:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1822 self._docket = docketutil.default_docket(self, header)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1823 else:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1824 self._docket = docketutil.parse_docket(
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1825 self, entry_data, use_pending=self._trypending
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1826 )
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1827
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1828 if self._docket is not None:
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1829 self._indexfile = self._docket.index_filepath()
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1830 index_data = b''
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1831 index_size = self._docket.index_end
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1832 if index_size > 0:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1833 index_data = self._get_data(
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1834 self._indexfile, mmapindexthreshold, size=index_size
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1835 )
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1836 if len(index_data) < index_size:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1837 msg = _(b'too few index data for %s: got %d, expected %d')
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1838 msg %= (self.display_id, len(index_data), index_size)
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1839 raise error.RevlogError(msg)
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1840
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1841 self._inline = False
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1842 # generaldelta implied by version 2 revlogs.
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1843 self.delta_config.general_delta = True
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1844 # the logic for persistent nodemap will be dealt with within the
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1845 # main docket, so disable it for now.
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1846 self._nodemap_file = None
47175
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1847
47324
0a3fa41fa719 revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47294
diff changeset
1848 if self._docket is not None:
0a3fa41fa719 revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47294
diff changeset
1849 self._datafile = self._docket.data_filepath()
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1850 self._sidedatafile = self._docket.sidedata_filepath()
47324
0a3fa41fa719 revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47294
diff changeset
1851 elif self.postfix is None:
47175
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1852 self._datafile = b'%s.d' % self.radix
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1853 else:
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1854 self._datafile = b'%s.d.%s' % (self.radix, self.postfix)
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1855
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
1856 self.nodeconstants = sha1nodeconstants
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
1857 self.nullid = self.nodeconstants.nullid
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
1858
41447
189e06b2d719 revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents: 41350
diff changeset
1859 # sparse-revlog can't be on without general-delta (issue6056)
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
1860 if not self.delta_config.general_delta:
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1861 self.delta_config.sparse_revlog = False
4985
e6525e459157 revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents: 4984
diff changeset
1862
39232
0a5b20c107a6 repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39231
diff changeset
1863 self._storedeltachains = True
30154
5e72129d75ed revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30012
diff changeset
1864
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
1865 devel_nodemap = (
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1866 self._nodemap_file
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1867 and force_nodemap
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1868 and parse_index_v1_nodemap is not None
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
1869 )
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
1870
44513
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1871 use_rust_index = False
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1872 if rustrevlog is not None:
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1873 if self._nodemap_file is not None:
44513
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1874 use_rust_index = True
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1875 else:
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1876 use_rust_index = self.opener.options.get(b'rust.index')
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1877
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1878 self._parse_index = parse_index_v1
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
1879 if self._format_version == REVLOGV0:
47038
724db234b790 revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47037
diff changeset
1880 self._parse_index = revlogv0.parse_index_v0
47173
ef7a8a1622ad revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47172
diff changeset
1881 elif self._format_version == REVLOGV2:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1882 self._parse_index = parse_index_v2
47266
921648d31553 changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47263
diff changeset
1883 elif self._format_version == CHANGELOGV2:
47270
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
1884 self._parse_index = parse_index_cl_v2
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
1885 elif devel_nodemap:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1886 self._parse_index = parse_index_v1_nodemap
44513
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1887 elif use_rust_index:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1888 self._parse_index = parse_index_v1_mixed
13265
04b302ce2781 revlog: always add the magic nullid/nullrev entry in parseindex
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13264
diff changeset
1889 try:
47176
8b549ea4bebf revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47175
diff changeset
1890 d = self._parse_index(index_data, self._inline)
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
1891 index, chunkcache = d
44320
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1892 use_nodemap = (
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1893 not self._inline
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1894 and self._nodemap_file is not None
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50811
diff changeset
1895 and hasattr(index, 'update_nodemap_data')
44320
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1896 )
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1897 if use_nodemap:
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1898 nodemap_data = nodemaputil.persisted_data(self)
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1899 if nodemap_data is not None:
44515
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1900 docket = nodemap_data[0]
44954
affe0fb42250 nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44516
diff changeset
1901 if (
affe0fb42250 nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44516
diff changeset
1902 len(d[0]) > docket.tip_rev
affe0fb42250 nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44516
diff changeset
1903 and d[0][docket.tip_rev][7] == docket.tip_node
affe0fb42250 nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44516
diff changeset
1904 ):
44515
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1905 # no changelog tampering
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1906 self._nodemap_docket = docket
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1907 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
1908 except (ValueError, IndexError):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1909 raise error.RevlogError(
47158
e1936ae27897 revlog: use revlog.display_id for corruption error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47157
diff changeset
1910 _(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
1911 )
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
1912 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
1913 # revnum -> (chain-length, sum-delta-length)
45779
8719a5b68419 revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents: 45735
diff changeset
1914 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
1915
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1916 return chunkcache
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1917
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1918 def _load_inner(self, chunk_cache):
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1919 if self._docket is None:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1920 default_compression_header = None
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1921 else:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1922 default_compression_header = self._docket.default_compression_header
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1923
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1924 self._inner = _InnerRevlog(
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1925 opener=self.opener,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1926 index=self.index,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1927 index_file=self._indexfile,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1928 data_file=self._datafile,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1929 sidedata_file=self._sidedatafile,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1930 inline=self._inline,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1931 data_config=self.data_config,
51090
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
1932 delta_config=self.delta_config,
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1933 feature_config=self.feature_config,
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1934 chunk_cache=chunk_cache,
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1935 default_compression_header=default_compression_header,
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1936 )
116
e484cd5ec282 Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents: 115
diff changeset
1937
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1938 def get_revlog(self):
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1939 """simple function to mirror API of other not-really-revlog API"""
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1940 return self
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1941
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
1942 @util.propertycache
47073
64cd1496bb70 revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
1943 def revlog_kind(self):
64cd1496bb70 revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
1944 return self.target[0]
64cd1496bb70 revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
1945
64cd1496bb70 revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
1946 @util.propertycache
47153
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
1947 def display_id(self):
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
1948 """The public facing "ID" of the revlog that we use in message"""
49534
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1949 if self.revlog_kind == KIND_FILELOG:
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1950 # Reference the file without the "data/" prefix, so it is familiar
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1951 # to the user.
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1952 return self.target[1]
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1953 else:
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1954 return self.radix
47153
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
1955
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1956 def _datafp(self, mode=b'r'):
35967
61326dd7cb8d revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents: 35845
diff changeset
1957 """file object for the revlog's data file"""
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
1958 return self.opener(self._datafile, mode=mode)
35967
61326dd7cb8d revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents: 35845
diff changeset
1959
43440
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1960 def tiprev(self):
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1961 return len(self.index) - 1
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1962
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1963 def tip(self):
43440
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1964 return self.node(self.tiprev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1965
24030
828dc8db5515 revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents: 23857
diff changeset
1966 def __contains__(self, rev):
828dc8db5515 revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents: 23857
diff changeset
1967 return 0 <= rev < len(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1968
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1969 def __len__(self):
38851
781b2720d2ac index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38850
diff changeset
1970 return len(self.index)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1971
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1972 def __iter__(self):
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49248
diff changeset
1973 return iter(range(len(self)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1974
17672
474047947b8f clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17537
diff changeset
1975 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
1976 """iterate over all rev in this revlog (from start to stop)"""
39881
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39879
diff changeset
1977 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
1978
16374
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1979 def hasnode(self, node):
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1980 try:
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1981 self.rev(node)
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1982 return True
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1983 except KeyError:
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1984 return False
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1985
51001
39fa0b948f5a revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51000
diff changeset
1986 def _candelta(self, baserev, rev):
36743
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1987 """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
1988 # 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
1989 # 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
1990 # 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
1991 # 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
1992 # rawtext contents) and the delta could be incompatible.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1993 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1994 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1995 ):
36743
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1996 return False
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1997 return True
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1998
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
1999 def update_caches(self, transaction):
51002
569eb5d0420d revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51001
diff changeset
2000 """update on disk cache
569eb5d0420d revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51001
diff changeset
2001
569eb5d0420d revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51001
diff changeset
2002 If a transaction is passed, the update may be delayed to transaction
569eb5d0420d revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51001
diff changeset
2003 commit."""
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
2004 if self._nodemap_file is not None:
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
2005 if transaction is None:
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
2006 nodemaputil.update_persistent_nodemap(self)
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
2007 else:
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
2008 nodemaputil.setup_persistent_nodemap(transaction, self)
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
2009
16414
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16375
diff changeset
2010 def clearcaches(self):
51003
6c3798b4597f revlog: document the `clearcaches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51002
diff changeset
2011 """Clear in-memory caches"""
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2012 self._chainbasecache.clear()
51098
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
2013 self._inner.clear_cache()
27465
072a675c51f2 revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27449
diff changeset
2014 self._pcache = {}
44501
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2015 self._nodemap_docket = None
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
2016 self.index.clearcaches()
44501
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2017 # The python code is the one responsible for validating the docket, we
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2018 # end up having to refresh it here.
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2019 use_nodemap = (
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2020 not self._inline
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
2021 and self._nodemap_file is not None
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50811
diff changeset
2022 and hasattr(self.index, 'update_nodemap_data')
44501
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2023 )
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2024 if use_nodemap:
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2025 nodemap_data = nodemaputil.persisted_data(self)
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2026 if nodemap_data is not None:
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2027 self._nodemap_docket = nodemap_data[0]
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
2028 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
2029
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
2030 def rev(self, node):
51004
ccddd2f54013 revlog: document the `rev` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51003
diff changeset
2031 """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
2032 try:
43553
2da51e292734 index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43552
diff changeset
2033 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
2034 except TypeError:
4092d12ba18a repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents: 21752
diff changeset
2035 raise
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2036 except error.RevlogError:
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
2037 # parsers.c radix tree lookup failed
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2038 if (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2039 node == self.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2040 or node in self.nodeconstants.wdirfilenodeids
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2041 ):
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
2042 raise error.WdirUnsupported
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
2043 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
2044
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2045 # Accessors for index entries.
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2046
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2047 # 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
2048 # are flags.
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2002
diff changeset
2049 def start(self, rev):
5006
c2febf5420e9 revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents: 5005
diff changeset
2050 return int(self.index[rev][0] >> 16)
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2051
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2052 def sidedata_cut_off(self, rev):
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2053 sd_cut_off = self.index[rev][8]
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2054 if sd_cut_off != 0:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2055 return sd_cut_off
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2056 # This is some annoying dance, because entries without sidedata
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2057 # currently use 0 as their ofsset. (instead of previous-offset +
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2058 # previous-size)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2059 #
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2060 # We should reconsider this sidedata → 0 sidata_offset policy.
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2061 # In the meantime, we need this.
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2062 while 0 <= rev:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2063 e = self.index[rev]
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2064 if e[9] != 0:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2065 return e[8] + e[9]
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2066 rev -= 1
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2067 return 0
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2068
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2069 def flags(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2070 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
2071
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2072 def length(self, rev):
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2073 return self.index[rev][1]
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2074
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2075 def sidedata_length(self, rev):
51058
7c2dc75cdc0f revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51057
diff changeset
2076 if not self.feature_config.has_side_data:
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2077 return 0
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2078 return self.index[rev][9]
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2079
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2080 def rawsize(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2081 """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
2082 l = self.index[rev][2]
38177
7fa3408f83ef revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents: 38169
diff changeset
2083 if l >= 0:
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2084 return l
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2085
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
2086 t = self.rawdata(rev)
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2087 return len(t)
31856
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
2088
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
2089 def size(self, rev):
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
2090 """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
2091 # 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
2092 # 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
2093 flags = self.flags(rev)
42730
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
2094 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
2095 return self.rawsize(rev)
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
2096
48529
c514936d92b4 revlog: remove deprecated APIs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48283
diff changeset
2097 return len(self.revision(rev))
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2098
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2099 def fast_rank(self, rev):
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2100 """Return the rank of a revision if already known, or None otherwise.
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2101
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2102 The rank of a revision is the size of the sub-graph it defines as a
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2103 head. Equivalently, the rank of a revision `r` is the size of the set
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2104 `ancestors(r)`, `r` included.
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2105
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2106 This method returns the rank retrieved from the revlog in constant
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2107 time. It makes no attempt at computing unknown values for versions of
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2108 the revlog which do not persist the rank.
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2109 """
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2110 rank = self.index[rev][ENTRY_RANK]
48851
d739cd69bb6a revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents: 48769
diff changeset
2111 if self._format_version != CHANGELOGV2 or rank == RANK_UNKNOWN:
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2112 return None
48851
d739cd69bb6a revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents: 48769
diff changeset
2113 if rev == nullrev:
d739cd69bb6a revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents: 48769
diff changeset
2114 return 0 # convention
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2115 return rank
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
2116
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
2117 def chainbase(self, rev):
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2118 base = self._chainbasecache.get(rev)
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2119 if base is not None:
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2120 return base
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2121
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
2122 index = self.index
38169
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
2123 iterrev = rev
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
2124 base = index[iterrev][3]
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
2125 while base != iterrev:
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
2126 iterrev = base
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
2127 base = index[iterrev][3]
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2128
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
2129 self._chainbasecache[rev] = base
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
2130 return base
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2131
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2132 def linkrev(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2133 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
2134
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2135 def parentrevs(self, rev):
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
2136 try:
35521
a0fab647a8f1 revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35345
diff changeset
2137 entry = self.index[rev]
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
2138 except IndexError:
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
2139 if rev == wdirrev:
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
2140 raise error.WdirUnsupported
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
2141 raise
47504
411dc27fd9fd corruption: backout changeset 49fd21f32695 (issue6528)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
2142
51062
14574a41a7a7 revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51061
diff changeset
2143 if self.feature_config.canonical_parent_order and entry[5] == nullrev:
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2144 return entry[6], entry[5]
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2145 else:
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2146 return entry[5], entry[6]
35521
a0fab647a8f1 revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35345
diff changeset
2147
40152
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2148 # fast parentrevs(rev) where rev isn't filtered
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2149 _uncheckedparentrevs = parentrevs
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2150
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2151 def node(self, rev):
32443
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
2152 try:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
2153 return self.index[rev][7]
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
2154 except IndexError:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
2155 if rev == wdirrev:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
2156 raise error.WdirUnsupported
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
2157 raise
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2158
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2159 # Derived from index values.
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2160
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2161 def end(self, rev):
46710
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
2162 return self.start(rev) + self.length(rev)
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2163
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2164 def parents(self, node):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2165 i = self.index
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2166 d = i[self.rev(node)]
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2167 # inline node() to avoid function call overhead
51062
14574a41a7a7 revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51061
diff changeset
2168 if self.feature_config.canonical_parent_order and d[5] == self.nullid:
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2169 return i[d[6]][7], i[d[5]][7]
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2170 else:
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
2171 return i[d[5]][7], i[d[6]][7]
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
2172
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2173 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
2174 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
2175
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
2176 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
2177 chaininfocache = self._chaininfocache
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2178 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
2179 return chaininfocache[rev]
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2180 index = self.index
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
2181 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
2182 iterrev = rev
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2183 e = index[iterrev]
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2184 clen = 0
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
2185 compresseddeltalen = 0
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2186 while iterrev != e[3]:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2187 clen += 1
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
2188 compresseddeltalen += e[1]
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2189 if generaldelta:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2190 iterrev = e[3]
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2191 else:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2192 iterrev -= 1
23306
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2193 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
2194 t = chaininfocache[iterrev]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2195 clen += t[0]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2196 compresseddeltalen += t[1]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2197 break
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2198 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
2199 else:
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2200 # 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
2201 # 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
2202 compresseddeltalen += e[1]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2203 r = (clen, compresseddeltalen)
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2204 chaininfocache[rev] = r
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2205 return r
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2206
27468
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
2207 def _deltachain(self, rev, stoprev=None):
51092
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
2208 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
2209
18081
f88c60e740a1 revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents: 17975
diff changeset
2210 def ancestors(self, revs, stoprev=0, inclusive=False):
40738
8947f49daaa8 revlog: update the docstring of `ancestors` to match reality
Boris Feld <boris.feld@octobus.net>
parents: 40627
diff changeset
2211 """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
2212 Does not generate revs lower than stoprev.
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2213
18090
9abc55ef85b5 revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents: 18083
diff changeset
2214 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
2215
40152
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2216 # first, make sure start revisions aren't filtered
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2217 revs = list(revs)
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2218 checkrev = self.node
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2219 for r in revs:
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2220 checkrev(r)
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2221 # and we're sure ancestors aren't filtered as well
41115
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2222
47269
6be2a7ca4b1d revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47266
diff changeset
2223 if rustancestor is not None and self.index.rust_ext_compat:
42452
a3a8887e4426 rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents: 42446
diff changeset
2224 lazyancestors = rustancestor.LazyAncestors
41115
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2225 arg = self.index
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2226 else:
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2227 lazyancestors = ancestor.lazyancestors
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2228 arg = self._uncheckedparentrevs
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2229 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
2230
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
2231 def descendants(self, revs):
39999
0b24fcd88066 dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39908
diff changeset
2232 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
2233
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2234 def findcommonmissing(self, common=None, heads=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2235 """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
2236 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
2237 tuple:
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2238
15835
fa15869bf95c revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15827
diff changeset
2239 ::common, (::heads) - (::common)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2240
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2241 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
2242 topologically sorted.
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2243
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2244 '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
2245 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
2246 supplied, uses nullid."""
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2247 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2248 common = [self.nullid]
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2249 if heads is None:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2250 heads = self.heads()
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2251
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2252 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
2253 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
2254
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2255 # we want the ancestors, but inclusive
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48928
diff changeset
2256 class lazyset:
20073
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2257 def __init__(self, lazyvalues):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2258 self.addedvalues = set()
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2259 self.lazyvalues = lazyvalues
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2260
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2261 def __contains__(self, value):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2262 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
2263
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2264 def __iter__(self):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2265 added = self.addedvalues
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2266 for r in added:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2267 yield r
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2268 for r in self.lazyvalues:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2269 if not r in added:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2270 yield r
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2271
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2272 def add(self, value):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2273 self.addedvalues.add(value)
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2274
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2275 def update(self, values):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2276 self.addedvalues.update(values)
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2277
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2278 has = lazyset(self.ancestors(common))
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
2279 has.add(nullrev)
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
2280 has.update(common)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2281
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2282 # 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
2283 missing = set()
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 24454
diff changeset
2284 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
2285 while visit:
16803
107a3270a24a cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents: 16786
diff changeset
2286 r = visit.popleft()
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2287 if r in missing:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2288 continue
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2289 else:
8453
d1ca637b0773 revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8391
diff changeset
2290 missing.add(r)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2291 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
2292 if p not in has:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2293 visit.append(p)
8453
d1ca637b0773 revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8391
diff changeset
2294 missing = list(missing)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2295 missing.sort()
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2296 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
2297
23337
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2298 def incrementalmissingrevs(self, common=None):
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2299 """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
2300 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
2301 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
2302 object.
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2303
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2304 '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
2305 nullrev.
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2306 """
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2307 if common is None:
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2308 common = [nullrev]
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2309
47269
6be2a7ca4b1d revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47266
diff changeset
2310 if rustancestor is not None and self.index.rust_ext_compat:
42452
a3a8887e4426 rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents: 42446
diff changeset
2311 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
2312 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
2313
17972
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2314 def findmissingrevs(self, common=None, heads=None):
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2315 """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
2316 are not ancestors of common.
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2317
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2318 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
2319 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
2320
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2321 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
2322 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
2323
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2324 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
2325 topologically sorted.
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2326
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2327 '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
2328 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
2329 supplied, uses nullid."""
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2330 if common is None:
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2331 common = [nullrev]
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2332 if heads is None:
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2333 heads = self.headrevs()
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2334
23338
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2335 inc = self.incrementalmissingrevs(common=common)
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2336 return inc.missingancestors(heads)
17972
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2337
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2338 def findmissing(self, common=None, heads=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2339 """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
2340
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2341 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
2342 satisfies the following constraints:
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2343
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2344 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
2345 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
2346
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2347 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
2348 topologically sorted.
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2349
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2350 '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
2351 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
2352 supplied, uses nullid."""
17971
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2353 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2354 common = [self.nullid]
17971
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2355 if heads is None:
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2356 heads = self.heads()
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2357
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2358 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
2359 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
2360
23338
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2361 inc = self.incrementalmissingrevs(common=common)
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2362 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
2363
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2364 def nodesbetween(self, roots=None, heads=None):
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2365 """Return a topological path from 'roots' to 'heads'.
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2366
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2367 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
2368 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
2369 these constraints:
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2370
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2371 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
2372 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
2373
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2374 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
2375 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
2376 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
2377
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2378 '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
2379 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
2380 '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
2381
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2382 '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
2383 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
2384 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
2385 nonodes = ([], [], [])
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2386 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
2387 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
2388 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
2389 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2390 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
2391 else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2392 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
2393 lowestrev = nullrev
3b4e00cba57a Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3508
diff changeset
2394 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
2395 # We want _all_ the nodes!
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2396 return (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2397 [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
2398 [self.nullid],
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2399 list(self.heads()),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2400 )
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2401 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
2402 # 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
2403 # node.
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2404 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
2405 # 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
2406 ancestors = None
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2407 # 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
2408 heads = {}
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2409 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
2410 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
2411 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
2412 return nonodes
8464
7af92e70bb25 revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8453
diff changeset
2413 ancestors = set()
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2414 # 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
2415 # 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
2416 # find from roots.
14219
c33427080671 revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents: 14208
diff changeset
2417 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
2418 # 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
2419 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
2420 # 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
2421 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
2422 while nodestotag:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2423 # 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
2424 n = nodestotag.pop()
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2425 # Never tag nullid
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2426 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
2427 continue
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2428 # 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
2429 # 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
2430 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
2431 if r >= lowestrev:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2432 if n not in ancestors:
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2433 # 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
2434 # 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
2435 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
2436 # 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
2437 nodestotag.update(
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2438 [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
2439 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2440 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
2441 # 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
2442 # any other heads.
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2443 heads.pop(n)
1459
106fdec8e1fb Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents: 1458
diff changeset
2444 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
2445 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2446 # 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
2447 # 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
2448
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2449 # 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
2450 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
2451 # 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
2452 # 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
2453
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2454 # Filter out roots that aren't ancestors of heads
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2455 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
2456 # 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
2457 if roots:
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2458 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
2459 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2460 # 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
2461 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2462 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2463 # 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
2464 # 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
2465 lowestrev = nullrev
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2466 roots = [self.nullid]
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
2467 # Transform our roots list into a set.
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2468 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
2469 # 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
2470 # '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
2471 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
2472 # 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
2473 orderedout = []
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2474 # Don't start at nullid since we don't want nullid in our output list,
17483
fe3b26048140 spelling: descendants
timeless@mozdev.org
parents: 17150
diff changeset
2475 # 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
2476 # 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
2477 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
2478 n = self.node(r)
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2479 isdescendant = False
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2480 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
2481 isdescendant = True
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2482 elif n in descendants:
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2483 # n is already a descendant
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2484 isdescendant = True
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2485 # 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
2486 # 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
2487 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
2488 # 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
2489 p = tuple(self.parents(n))
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2490 # 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
2491 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
2492 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
2493 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2494 p = tuple(self.parents(n))
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2495 # 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
2496 # 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
2497 # up there, remember?)
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2498 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
2499 descendants.add(n)
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2500 isdescendant = True
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2501 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
2502 # 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
2503 orderedout.append(n)
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2504 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
2505 # 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
2506 # from roots.
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2507 # 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
2508 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
2509 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
2510 # 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
2511 # 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
2512 # 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
2513 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
2514 # 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
2515 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
2516 heads.pop(p, None)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
2517 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
2518 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
2519 assert orderedout
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2520 assert roots
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2521 assert heads
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2522 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
2523
41275
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2524 def headrevs(self, revs=None):
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2525 if revs is None:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2526 try:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2527 return self.index.headrevs()
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2528 except AttributeError:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2529 return self._headrevs()
47269
6be2a7ca4b1d revlog: do not call Rust code if the index is not compatible with it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47266
diff changeset
2530 if rustdagop is not None and self.index.rust_ext_compat:
42452
a3a8887e4426 rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents: 42446
diff changeset
2531 return rustdagop.headrevs(self.index, revs)
41763
6843379bf99e changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents: 41689
diff changeset
2532 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
2533
24444
27e3ba73fbb1 phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents: 24255
diff changeset
2534 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
2535 return self.index.computephasesmapsets(roots)
24444
27e3ba73fbb1 phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents: 24255
diff changeset
2536
17674
e69274f8d444 clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17673
diff changeset
2537 def _headrevs(self):
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2538 count = len(self)
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2539 if not count:
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2540 return [nullrev]
17673
d686c6876ef6 clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17672
diff changeset
2541 # 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
2542 ishead = [0] * (count + 1)
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2543 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
2544 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
2545 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
2546 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
2547 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
2548 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
2549
3923
27230c29bfec fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3755
diff changeset
2550 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
2551 """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
2552
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
2553 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
2554 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
2555 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
2556 as if they had no children
1551
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
2557 """
4991
9c8c42bcf17a revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents: 4990
diff changeset
2558 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
2559 if not len(self):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2560 return [self.nullid]
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2561 return [self.node(r) for r in self.headrevs()]
4991
9c8c42bcf17a revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents: 4990
diff changeset
2562
1551
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
2563 if start is None:
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2564 start = nullrev
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2565 else:
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2566 start = self.rev(start)
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2567
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2568 stoprevs = {self.rev(n) for n in stop or []}
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2569
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2570 revs = dagop.headrevssubset(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2571 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2572 )
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2573
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2574 return [self.node(rev) for rev in revs]
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2575
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2576 def children(self, node):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2577 """find the children of a given node"""
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2578 c = []
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2579 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
2580 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
2581 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
2582 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
2583 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
2584 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
2585 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
2586 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
2587 c.append(self.node(r))
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2588 return c
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 484
diff changeset
2589
21104
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
2590 def commonancestorsheads(self, a, b):
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
2591 """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
2592 a, b = self.rev(a), self.rev(b)
38512
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2593 ancs = self._commonancestorsheads(a, b)
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2594 return pycompat.maplist(self.node, ancs)
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2595
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2596 def _commonancestorsheads(self, *revs):
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2597 """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
2598 try:
38512
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2599 ancs = self.index.commonancestorsheads(*revs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2600 except (AttributeError, OverflowError): # C implementation failed
38512
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2601 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs)
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2602 return ancs
21104
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
2603
22381
392ae5cb8d62 revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents: 22282
diff changeset
2604 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
2605 """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
2606
160da69ba1bf revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38663
diff changeset
2607 A revision is considered an ancestor of itself."""
38514
cc3543c87de5 revlog: reuse 'descendant' implemention in 'isancestor'
Boris Feld <boris.feld@octobus.net>
parents: 38513
diff changeset
2608 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
2609 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
2610
a06b2b032557 revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38665
diff changeset
2611 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
2612 """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
2613
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2614 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
2615
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2616 The implementation of this is trivial but the use of
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2617 reachableroots is not."""
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2618 if a == nullrev:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2619 return True
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2620 elif a == b:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2621 return True
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2622 elif a > b:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2623 return False
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2624 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
2625
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2626 def reachableroots(self, minroot, heads, roots, includepath=False):
43779
2e30d7df4809 revlog: fix revset in reachableroots docstring
Jun Wu <quark@fb.com>
parents: 43619
diff changeset
2627 """return (heads(::(<roots> and <roots>::<heads>)))
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2628
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2629 If includepath is True, return (<roots>::<heads>)."""
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2630 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2631 return self.index.reachableroots2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2632 minroot, heads, roots, includepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2633 )
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2634 except AttributeError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2635 return dagop._reachablerootspure(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2636 self.parentrevs, minroot, roots, heads, includepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2637 )
22381
392ae5cb8d62 revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents: 22282
diff changeset
2638
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
2639 def ancestor(self, a, b):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22381
diff changeset
2640 """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
2641
10897
adb6a291bbdb revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10404
diff changeset
2642 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
2643 try:
5bae936764bb parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents: 18987
diff changeset
2644 ancs = self.index.ancestors(a, b)
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
2645 except (AttributeError, OverflowError):
18988
5bae936764bb parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents: 18987
diff changeset
2646 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
2647 if ancs:
3605d4e7e618 revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents: 18986
diff changeset
2648 # choose a consistent winner when there's a tie
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
2649 return min(map(self.node, ancs))
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2650 return self.nullid
10897
adb6a291bbdb revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10404
diff changeset
2651
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2652 def _match(self, id):
16762
93f8b9565257 revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents: 16686
diff changeset
2653 if isinstance(id, int):
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
2654 # 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
2655 return self.node(id)
47042
c5e1cc0b4c77 core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents: 47041
diff changeset
2656 if len(id) == self.nodeconstants.nodelen:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2657 # possibly a binary node
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2658 # odds of a binary node being all hex in ASCII are 1 in 10**25
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2659 try:
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2660 node = id
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2661 self.rev(node) # quick search the index
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2662 return node
39775
974592474dee revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39774
diff changeset
2663 except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2664 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
2665 try:
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
2666 # str(rev)
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
2667 rev = int(id)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2668 if b"%d" % rev != id:
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2669 raise ValueError
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2670 if rev < 0:
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2671 rev = len(self) + rev
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2672 if rev < 0 or rev >= len(self):
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2673 raise ValueError
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
2674 return self.node(rev)
469
e205194ca7ef Various node id lookup tweaks
mpm@selenic.com
parents: 451
diff changeset
2675 except (ValueError, OverflowError):
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
2676 pass
47041
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47038
diff changeset
2677 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
2678 try:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2679 # a full hex nodeid?
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2680 node = bin(id)
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
2681 self.rev(node)
3157
4fe41a9e4591 optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3156
diff changeset
2682 return node
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 49247
diff changeset
2683 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
2684 pass
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2685
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2686 def _partialmatch(self, id):
37449
a0d71618074f revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 37443
diff changeset
2687 # we don't care wdirfilenodeids as they should be always full hash
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2688 maybewdir = self.nodeconstants.wdirhex.startswith(id)
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2689 ambiguous = False
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
2690 try:
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2691 partial = self.index.partialmatch(id)
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2692 if partial and self.hasnode(partial):
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2693 if maybewdir:
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2694 # single 'ff...' match in radix tree, ambiguous with wdir
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2695 ambiguous = True
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2696 else:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2697 return partial
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2698 elif maybewdir:
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2699 # no 'ff...' match in radix tree, wdir identified
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2700 raise error.WdirUnsupported
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2701 else:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2702 return None
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2703 except error.RevlogError:
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
2704 # 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
2705 # 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
2706 if not getattr(self, 'filteredrevs', None):
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2707 ambiguous = True
19471
fd1bb7c1be78 revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents: 19326
diff changeset
2708 # 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
2709 except (AttributeError, ValueError):
49415
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2710 # 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
2711 pass
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2712 if ambiguous:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2713 raise error.AmbiguousPrefixLookupError(
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2714 id, self.display_id, _(b'ambiguous identifier')
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2715 )
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
2716
13258
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
2717 if id in self._pcache:
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
2718 return self._pcache[id]
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
2719
37819
ee3d58b4a47f revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
2720 if len(id) <= 40:
49247
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2721 # hex(node)[:...]
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2722 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
2723 try:
49415
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2724 # we're dropping the last digit, so let's check that it's hex,
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2725 # to avoid the expensive computation below if it's not
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2726 if len(id) % 2 > 0:
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2727 if not (id[-1] in hexdigits):
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2728 return None
49246
31602d471b60 revlog: make round-down pattern clearer
Manuel Jacob <me@manueljacob.de>
parents: 49227
diff changeset
2729 prefix = bin(id[:l])
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 49247
diff changeset
2730 except binascii.Error:
49247
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2731 pass
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2732 else:
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
2733 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
2734 nl = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2735 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
2736 ]
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2737 if self.nodeconstants.nullhex.startswith(id):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2738 nl.append(self.nullid)
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
2739 if len(nl) > 0:
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2740 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
2741 self._pcache[id] = nl[0]
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
2742 return nl[0]
39774
4a2466b2a434 revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39773
diff changeset
2743 raise error.AmbiguousPrefixLookupError(
47159
1ec64f59dc27 revlog: use revlog.display_id in ambiguity errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47158
diff changeset
2744 id, self.display_id, _(b'ambiguous identifier')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2745 )
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2746 if maybewdir:
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2747 raise error.WdirUnsupported
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
2748 return None
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2749
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2750 def lookup(self, id):
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2751 """locate a node based on:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2752 - revision number or str(revision number)
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2753 - 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
2754 """
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2755 n = self._match(id)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2756 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
2757 return n
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2758 n = self._partialmatch(id)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2759 if n:
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2760 return n
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 484
diff changeset
2761
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
2762 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
2763
37767
44d1959acb3b revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37494
diff changeset
2764 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
2765 """Find the shortest unambiguous prefix that matches node."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2766
37863
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
2767 def isvalid(prefix):
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2768 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
2769 matchednode = self._partialmatch(prefix)
39831
7a9e2d85f475 revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents: 39778
diff changeset
2770 except error.AmbiguousPrefixLookupError:
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2771 return False
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2772 except error.WdirUnsupported:
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2773 # single 'ff...' match
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2774 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
2775 if matchednode is None:
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
2776 raise error.LookupError(node, self.display_id, _(b'no node'))
37970
76e933e0ccc9 shortest: remove unnecessary check for revnum in isvalid()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37969
diff changeset
2777 return True
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2778
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2779 def maybewdir(prefix):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2780 return all(c == b'f' for c in pycompat.iterbytestr(prefix))
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2781
37767
44d1959acb3b revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37494
diff changeset
2782 hexnode = hex(node)
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2783
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2784 def disambiguate(hexnode, minlength):
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37970
diff changeset
2785 """Disambiguate against wdirid."""
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
2786 for length in range(minlength, len(hexnode) + 1):
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2787 prefix = hexnode[:length]
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37970
diff changeset
2788 if not maybewdir(prefix):
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2789 return prefix
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2790
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2791 if not getattr(self, 'filteredrevs', None):
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2792 try:
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2793 length = max(self.index.shortest(node), minlength)
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2794 return disambiguate(hexnode, length)
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2795 except error.RevlogError:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2796 if node != self.nodeconstants.wdirid:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2797 raise error.LookupError(
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
2798 node, self.display_id, _(b'no node')
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2799 )
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2800 except AttributeError:
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2801 # Fall through to pure code
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2802 pass
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2803
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2804 if node == self.nodeconstants.wdirid:
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
2805 for length in range(minlength, len(hexnode) + 1):
37969
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2806 prefix = hexnode[:length]
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2807 if isvalid(prefix):
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2808 return prefix
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2809
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
2810 for length in range(minlength, len(hexnode) + 1):
37863
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
2811 prefix = hexnode[:length]
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
2812 if isvalid(prefix):
37969
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2813 return disambiguate(hexnode, length)
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2814
2890
5df3e5cf16bc Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
2815 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
2816 """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
2817
a463e3c50212 cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11323
diff changeset
2818 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
2819 """
2890
5df3e5cf16bc Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
2820 p1, p2 = self.parents(node)
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
2821 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
2822
11929
1839a7518b0d revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 11928
diff changeset
2823 def deltaparent(self, rev):
14195
0013d3eeb826 revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents: 14164
diff changeset
2824 """return deltaparent of the given revision"""
14253
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
2825 base = self.index[rev][3]
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
2826 if base == rev:
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2827 return nullrev
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
2828 elif self.delta_config.general_delta:
14253
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
2829 return base
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2830 else:
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2831 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
2832
39149
f8db458651c8 revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents: 39147
diff changeset
2833 def issnapshot(self, rev):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2834 """tells whether rev is a snapshot"""
51090
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
2835 ret = self._inner.issnapshot(rev)
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
2836 self.issnapshot = self._inner.issnapshot
ff673b9da21f revlog: add a couple more of useful method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51089
diff changeset
2837 return ret
39149
f8db458651c8 revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents: 39147
diff changeset
2838
39152
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
2839 def snapshotdepth(self, rev):
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
2840 """number of snapshot in the chain before this one"""
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
2841 if not self.issnapshot(rev):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2842 raise error.ProgrammingError(b'revision %d not a snapshot')
51092
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
2843 return len(self._inner._deltachain(rev)[0]) - 1
39152
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
2844
1941
7518823709a2 revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1853
diff changeset
2845 def revdiff(self, rev1, rev2):
31753
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2846 """return or calculate a delta between two revisions
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2847
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2848 The delta calculated is in binary form and is intended to be written to
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2849 revlog data directly. So this function needs raw revision data.
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2850 """
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2851 if rev1 != nullrev and self.deltaparent(rev2) == rev1:
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
2852 return bytes(self._inner._chunk(rev2))
5005
72082bfced9a revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents: 5004
diff changeset
2853
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2854 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
2855
51019
33d2f0164d0d revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51017
diff changeset
2856 def revision(self, nodeorrev):
16435
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16424
diff changeset
2857 """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
2858 number.
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16424
diff changeset
2859 """
51019
33d2f0164d0d revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51017
diff changeset
2860 return self._revisiondata(nodeorrev)
42718
389233789952 revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42688
diff changeset
2861
51021
299b7b5440db revlog: drop the df argument to `sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51020
diff changeset
2862 def sidedata(self, nodeorrev):
42980
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2863 """a map of extra data related to the changeset but not part of the hash
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2864
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2865 This function currently return a dictionary. However, more advanced
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2866 mapping object will likely be used in the future for a more
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2867 efficient/lazy code.
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2868 """
47382
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2869 # deal with <nodeorrev> argument type
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2870 if isinstance(nodeorrev, int):
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2871 rev = nodeorrev
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2872 else:
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2873 rev = self.rev(nodeorrev)
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2874 return self._sidedata(rev)
42980
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2875
51094
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2876 def _rawtext(self, node, rev):
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2877 """return the possibly unvalidated rawtext for a revision
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2878
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2879 returns (rev, rawtext, validated)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2880 """
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2881 # Check if we have the entry in cache
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2882 # The cache entry looks like (node, rev, rawtext)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2883 if self._inner._revisioncache:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2884 if self._inner._revisioncache[0] == node:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2885 return (rev, self._inner._revisioncache[2], True)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2886
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2887 if rev is None:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2888 rev = self.rev(node)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2889
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2890 return self._inner.raw_text(node, rev)
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2891
51023
8520db304f01 revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51022
diff changeset
2892 def _revisiondata(self, nodeorrev, raw=False):
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
2893 # deal with <nodeorrev> argument type
16375
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2894 if isinstance(nodeorrev, int):
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2895 rev = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2896 node = self.node(rev)
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2897 else:
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2898 node = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2899 rev = None
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2900
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
2901 # fast path the special `nullid` rev
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2902 if node == self.nullid:
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
2903 return b""
42789
bf070a59546a revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42788
diff changeset
2904
43979
bdb357161d7a revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents: 43957
diff changeset
2905 # ``rawtext`` is the text as stored inside the revlog. Might be the
bdb357161d7a revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents: 43957
diff changeset
2906 # revision or might need to be processed to retrieve the revision.
51023
8520db304f01 revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51022
diff changeset
2907 rev, rawtext, validated = self._rawtext(node, rev)
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2908
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2909 if raw and validated:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2910 # if we don't want to process the raw text and that raw
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2911 # text is cached, we can exit early.
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
2912 return rawtext
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2913 if rev is None:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2914 rev = self.rev(node)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2915 # the revlog's flag for this revision
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2916 # (usually alter its state or content)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2917 flags = self.flags(rev)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2918
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2919 if validated and flags == REVIDX_DEFAULT_FLAGS:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2920 # no extra flags set, no flag processor runs, text = rawtext
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
2921 return rawtext
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2922
42879
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
2923 if raw:
42992
dff95420480f flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42991
diff changeset
2924 validatehash = flagutil.processflagsraw(self, rawtext, flags)
42879
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
2925 text = rawtext
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
2926 else:
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2927 r = flagutil.processflagsread(self, rawtext, flags)
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2928 text, validatehash = r
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2929 if validatehash:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2930 self.checkhash(text, node, rev=rev)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2931 if not validated:
51093
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2932 self._inner._revisioncache = (node, rev, rawtext)
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2933
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
2934 return text
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2935
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2936 def _sidedata(self, rev):
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2937 """Return the sidedata for a given revision number."""
51095
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
2938 sidedata_end = None
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
2939 if self._docket is not None:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
2940 sidedata_end = self._docket.sidedata_end
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
2941 return self._inner.sidedata(rev, sidedata_end)
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2942
51020
14de15825253 revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51019
diff changeset
2943 def rawdata(self, nodeorrev):
14de15825253 revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51019
diff changeset
2944 """return an uncompressed raw data of a given node or revision number."""
14de15825253 revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51019
diff changeset
2945 return self._revisiondata(nodeorrev, raw=True)
42719
415e4136d326 rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42718
diff changeset
2946
22785
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
2947 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
2948 """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
2949
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
2950 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
2951 as needed.
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
2952 """
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
2953 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
2954
30584
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2955 def checkhash(self, text, node, p1=None, p2=None, rev=None):
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2956 """Check node hash integrity.
19624
55749cb14d24 revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents: 19471
diff changeset
2957
30584
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2958 Available as a function so that subclasses can extend hash mismatch
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2959 behaviors as needed.
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2960 """
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2961 try:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2962 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
2963 p1, p2 = self.parents(node)
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2964 if node != self.hash(text, p1, p2):
40054
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2965 # Clear the revision cache on hash failure. The revision cache
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2966 # only stores the raw revision and clearing the cache does have
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2967 # the side-effect that we won't have a cache hit when the raw
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2968 # revision data is accessed. But this case should be rare and
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2969 # it is extra work to teach the cache about the hash
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2970 # verification state.
51093
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2971 if (
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2972 self._inner._revisioncache
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2973 and self._inner._revisioncache[0] == node
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2974 ):
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2975 self._inner._revisioncache = None
40054
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2976
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2977 revornode = rev
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2978 if revornode is None:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2979 revornode = templatefilters.short(hex(node))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2980 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2981 _(b"integrity check failed on %s:%s")
47160
0a66eef0ed97 revlog: use revlog.display_id in integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47159
diff changeset
2982 % (self.display_id, pycompat.bytestr(revornode))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2983 )
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2984 except error.RevlogError:
51047
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
2985 if self.feature_config.censorable and storageutil.iscensoredtext(
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
2986 text
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
2987 ):
47161
f574734eb2b7 revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47160
diff changeset
2988 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
2989 raise
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2990
50658
978ffa09910b revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50348
diff changeset
2991 @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
2992 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
2993 """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
2994
978ffa09910b revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50348
diff changeset
2995 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
2996 it is always expected at the same location."""
50811
4a3a9d961561 revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
2997 parts = self.radix.split(b'/')
50659
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
2998 if len(parts) > 1:
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
2999 # adds a '-s' prefix to the ``data/` or `meta/` base
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
3000 head = parts[0] + b'-s'
50811
4a3a9d961561 revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
3001 mids = parts[1:-1]
4a3a9d961561 revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
3002 tail = parts[-1] + b'.i'
4a3a9d961561 revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
3003 pieces = [head] + mids + [tail]
4a3a9d961561 revlog: fix the naming scheme use by split temporary file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
3004 return b'/'.join(pieces)
50659
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
3005 else:
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
3006 # the revlog is stored at the root of the store (changelog or
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
3007 # manifest), no risk of collision.
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
3008 return self.radix + b'.i.s'
50658
978ffa09910b revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50348
diff changeset
3009
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3010 def _enforceinlinesize(self, tr, side_write=True):
26376
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
3011 """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
3012
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
3013 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
3014 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
3015 to use multiple index and data files.
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
3016 """
38844
119d14f41cb2 revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
3017 tiprev = len(self) - 1
47167
88bd08a6830f revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47166
diff changeset
3018 total_size = self.start(tiprev) + self.length(tiprev)
88bd08a6830f revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47166
diff changeset
3019 if not self._inline or total_size < _maxinline:
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3020 return
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
3021
51085
31f143448704 revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51084
diff changeset
3022 if self._docket is not None:
31f143448704 revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51084
diff changeset
3023 msg = b"inline revlog should not have a docket"
31f143448704 revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51084
diff changeset
3024 raise error.ProgrammingError(msg)
31f143448704 revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51084
diff changeset
3025
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
3026 troffset = tr.findoffset(self._inner.canonical_index_file)
45870
a6f08085edfe transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents: 45869
diff changeset
3027 if troffset is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3028 raise error.RevlogError(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3029 _(b"%s not found in the transaction") % self._indexfile
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3030 )
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3031 if troffset:
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
3032 tr.addbackup(self._inner.canonical_index_file, for_offset=True)
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
3033 tr.add(self._datafile, 0)
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
3034
51087
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3035 new_index_file_path = None
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3036 if side_write:
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3037 old_index_file_path = self._indexfile
50658
978ffa09910b revlog: move the computation of the split_index path in a property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50348
diff changeset
3038 new_index_file_path = self._split_index_file
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3039 opener = self.opener
50348
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3040 weak_self = weakref.ref(self)
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3041
51087
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3042 # the "split" index replace the real index when the transaction is
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3043 # finalized
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3044 def finalize_callback(tr):
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3045 opener.rename(
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3046 new_index_file_path,
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3047 old_index_file_path,
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3048 checkambig=True,
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3049 )
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
3050 maybe_self = weak_self()
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3051 if maybe_self is not None:
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3052 maybe_self._indexfile = old_index_file_path
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3053 maybe_self._inner.index_file = maybe_self._indexfile
50348
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3054
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3055 def abort_callback(tr):
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3056 maybe_self = weak_self()
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3057 if maybe_self is not None:
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3058 maybe_self._indexfile = old_index_file_path
51087
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3059 maybe_self._inner.inline = True
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3060 maybe_self._inner.index_file = old_index_file_path
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3061
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3062 tr.registertmp(new_index_file_path)
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3063 if self.target[1] is not None:
50348
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3064 callback_id = b'000-revlog-split-%d-%s' % self.target
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
3065 else:
50348
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3066 callback_id = b'000-revlog-split-%d' % self.target[0]
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3067 tr.addfinalize(callback_id, finalize_callback)
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
3068 tr.addabort(callback_id, abort_callback)
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
3069
51087
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3070 self._format_flags &= ~FLAG_INLINE_DATA
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3071 self._inner.split_inline(
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3072 tr,
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3073 self._format_flags | self._format_version,
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3074 new_index_file_path=new_index_file_path,
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3075 )
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3076
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3077 self._inline = False
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3078 if new_index_file_path is not None:
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3079 self._indexfile = new_index_file_path
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3080
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
3081 nodemaputil.setup_persistent_nodemap(tr, self)
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3082
39886
debc4ee597e7 revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents: 39881
diff changeset
3083 def _nodeduplicatecallback(self, transaction, node):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
3084 """called when trying to add a node already stored."""
39886
debc4ee597e7 revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents: 39881
diff changeset
3085
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3086 @contextlib.contextmanager
47463
5fa083a5ff04 copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents: 47457
diff changeset
3087 def reading(self):
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3088 with self._inner.reading():
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3089 yield
47463
5fa083a5ff04 copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents: 47457
diff changeset
3090
5fa083a5ff04 copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents: 47457
diff changeset
3091 @contextlib.contextmanager
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3092 def _writing(self, transaction):
47240
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
3093 if self._trypending:
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
3094 msg = b'try to write in a `trypending` revlog: %s'
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
3095 msg %= self.display_id
4f38ada3fc26 revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47239
diff changeset
3096 raise error.ProgrammingError(msg)
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3097 if self._inner.is_writing:
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3098 yield
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3099 else:
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3100 data_end = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3101 sidedata_end = None
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3102 if self._docket is not None:
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3103 data_end = self._docket.data_end
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3104 sidedata_end = self._docket.sidedata_end
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3105 with self._inner.writing(
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3106 transaction,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3107 data_end=data_end,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3108 sidedata_end=sidedata_end,
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3109 ):
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
3110 yield
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
3111 if self._docket is not None:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
3112 self._write_docket(transaction)
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3113
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
3114 @property
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
3115 def is_delaying(self):
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
3116 return self._inner.is_delaying
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3117
47239
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3118 def _write_docket(self, transaction):
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3119 """write the current docket on disk
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3120
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3121 Exist as a method to help changelog to implement transaction logic
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3122
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3123 We could also imagine using the same transaction logic for all revlog
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3124 since docket are cheap."""
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3125 self._docket.write(transaction)
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3126
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3127 def addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3128 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3129 text,
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 cachedelta=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3135 node=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3136 flags=REVIDX_DEFAULT_FLAGS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3137 deltacomputer=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3138 sidedata=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3139 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3140 """add a revision to the log
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3141
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3142 text - the revision data to add
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3143 transaction - the transaction object used for rollback
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3144 link - the linkrev data to add
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3145 p1, p2 - the parent nodeids of the revision
12012
bade7a9c5c07 revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12011
diff changeset
3146 cachedelta - an optional precomputed delta
19625
6a411a06cb1f revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents: 19624
diff changeset
3147 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
3148 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
3149 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
3150 flags - the known flags to set on the revision
39330
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
3151 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
3152 multiple calls
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3153 """
19326
7014526d67a8 revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents: 19200
diff changeset
3154 if link == nullrev:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3155 raise error.RevlogError(
47163
6bc7c467a7d1 revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
3156 _(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
3157 )
25459
0bda5bfaf0b1 revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents: 25410
diff changeset
3158
42986
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
3159 if sidedata is None:
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
3160 sidedata = {}
51058
7c2dc75cdc0f revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51057
diff changeset
3161 elif sidedata and not self.feature_config.has_side_data:
43030
827cb4fe62a3 sidedata: introduce a new requirement to protect the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43025
diff changeset
3162 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3163 _(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
3164 )
42986
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
3165
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3166 if flags:
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3167 node = node or self.hash(text, p1, p2)
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3168
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3169 rawtext, validatehash = flagutil.processflagswrite(self, text, flags)
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3170
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3171 # If the flag processor modifies the revision data, ignore any provided
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3172 # cachedelta.
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
3173 if rawtext != text:
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3174 cachedelta = None
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3175
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
3176 if len(rawtext) > _maxentrysize:
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
3177 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3178 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3179 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
3180 )
47162
dfe8074239de revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47161
diff changeset
3181 % (self.display_id, len(rawtext))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3182 )
25459
0bda5bfaf0b1 revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents: 25410
diff changeset
3183
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
3184 node = node or self.hash(rawtext, p1, p2)
46508
f7b61ad3c64a revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents: 46507
diff changeset
3185 rev = self.index.get_rev(node)
f7b61ad3c64a revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents: 46507
diff changeset
3186 if rev is not None:
f7b61ad3c64a revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents: 46507
diff changeset
3187 return rev
12023
44c22dc193a4 revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12012
diff changeset
3188
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3189 if validatehash:
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
3190 self.checkhash(rawtext, node, p1=p1, p2=p2)
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3191
46508
f7b61ad3c64a revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents: 46507
diff changeset
3192 return self.addrawrevision(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3193 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3194 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3195 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3196 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3197 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3198 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3199 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3200 cachedelta=cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3201 deltacomputer=deltacomputer,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3202 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3203 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3204
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3205 def addrawrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3206 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3207 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3208 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3209 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3210 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3211 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3212 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3213 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3214 cachedelta=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3215 deltacomputer=None,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3216 sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3217 ):
32244
3de4c61b5087 revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents: 32229
diff changeset
3218 """add a raw revision with known flags, node and parents
3de4c61b5087 revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents: 32229
diff changeset
3219 useful when reusing a revision not stored in this revlog (ex: received
3de4c61b5087 revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents: 32229
diff changeset
3220 over wire, or read from an external bundle).
3de4c61b5087 revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents: 32229
diff changeset
3221 """
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3222 with self._writing(transaction):
46507
9ee4e988e2be revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents: 46506
diff changeset
3223 return self._addrevision(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3224 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3225 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3226 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3227 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3228 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3229 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3230 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3231 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3232 deltacomputer=deltacomputer,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3233 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3234 )
3390
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
3235
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
3236 def compress(self, data):
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
3237 return self._inner.compress(data)
17128
1028a1c9077a revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents: 17009
diff changeset
3238
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
3239 def decompress(self, data):
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
3240 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
3241
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3242 def _addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3243 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3244 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3245 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3246 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3247 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3248 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3249 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3250 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3251 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3252 alwayscache=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3253 deltacomputer=None,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3254 sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3255 ):
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
3256 """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
3257
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
3258 see addrevision for argument descriptions.
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3259
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3260 note: "addrevision" takes non-raw text, "_addrevision" takes raw text.
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3261
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3262 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
3263 be used.
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3264
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
3265 invariants:
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3266 - 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
3267 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
3268 """
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3269 if node == self.nullid:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3270 raise error.RevlogError(
47163
6bc7c467a7d1 revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
3271 _(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
3272 )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3273 if (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3274 node == self.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3275 or node in self.nodeconstants.wdirfilenodeids
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3276 ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3277 raise error.RevlogError(
47163
6bc7c467a7d1 revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
3278 _(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
3279 )
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3280 if self._inner._writinghandles is None:
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3281 msg = b'adding revision outside `revlog._writing` context'
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3282 raise error.ProgrammingError(msg)
34028
bfb38c5cebf4 revlog: move check for wdir from changelog to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 34026
diff changeset
3283
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3284 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
3285
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3286 curr = len(self)
4981
e7131935fbb3 revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents: 4980
diff changeset
3287 prev = curr - 1
46710
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3288
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3289 offset = self._get_data_offset(prev)
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3290
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3291 if self._concurrencychecker:
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
3292 ifh, dfh, sdfh = self._inner._writinghandles
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3293 # XXX no checking for the sidedata file
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3294 if self._inline:
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3295 # offset is "as if" it were in the .d file, so we need to add on
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3296 # the size of the entry metadata.
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3297 self._concurrencychecker(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3298 ifh, self._indexfile, offset + curr * self.index.entry_size
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3299 )
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3300 else:
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3301 # Entries in the .i are a consistent size.
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3302 self._concurrencychecker(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3303 ifh, self._indexfile, curr * self.index.entry_size
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3304 )
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
3305 self._concurrencychecker(dfh, self._datafile, offset)
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3306
12889
5482c6b826f4 revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents: 12888
diff changeset
3307 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
3308
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
3309 # 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
3310 # become comparable to the uncompressed text
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3311 if rawtext is None:
36748
369aadf7a326 revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents: 36744
diff changeset
3312 # need rawtext size, before changed by flag processors, which is
369aadf7a326 revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents: 36744
diff changeset
3313 # the non-raw size. use revlog explicitly to avoid filelog's extra
369aadf7a326 revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents: 36744
diff changeset
3314 # logic that might remove metadata size.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3315 textlen = mdiff.patchedsize(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3316 revlog.size(self, cachedelta[0]), cachedelta[1]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3317 )
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
3318 else:
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3319 textlen = len(rawtext)
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
3320
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3321 if deltacomputer is None:
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3322 write_debug = None
51051
ab2bc31fa91f revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51048
diff changeset
3323 if self.delta_config.debug_delta:
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3324 write_debug = transaction._report
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3325 deltacomputer = deltautil.deltacomputer(
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3326 self, write_debug=write_debug
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3327 )
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3328
49677
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3329 if cachedelta is not None and len(cachedelta) == 2:
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3330 # If the cached delta has no information about how it should be
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3331 # reused, add the default reuse instruction according to the
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3332 # revlog's configuration.
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3333 if (
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3334 self.delta_config.general_delta
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3335 and self.delta_config.lazy_delta_base
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3336 ):
49677
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3337 delta_base_reuse = DELTA_BASE_REUSE_TRY
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3338 else:
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3339 delta_base_reuse = DELTA_BASE_REUSE_NO
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3340 cachedelta = (cachedelta[0], cachedelta[1], delta_base_reuse)
05db41701ece find-delta: pass the cache-delta usage policy alongside the cache-delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49663
diff changeset
3341
47399
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3342 revinfo = revlogutils.revisioninfo(
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3343 node,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3344 p1,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3345 p2,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3346 btext,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3347 textlen,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3348 cachedelta,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3349 flags,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3350 )
36744
33275ab5e837 revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents: 36743
diff changeset
3351
51017
509f0f7fc89e delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51015
diff changeset
3352 deltainfo = deltacomputer.finddeltainfo(revinfo)
35634
b43578ec483a revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents: 35521
diff changeset
3353
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
3354 compression_mode = COMP_MODE_INLINE
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
3355 if self._docket is not None:
47452
c6844912c327 revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47450
diff changeset
3356 default_comp = self._docket.default_compression_header
c6844912c327 revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47450
diff changeset
3357 r = deltautil.delta_compression(default_comp, deltainfo)
c6844912c327 revlog: factor the logic to determine the delta compression out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47450
diff changeset
3358 compression_mode, deltainfo = r
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
3359
47256
2b69555e4875 revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47255
diff changeset
3360 sidedata_compression_mode = COMP_MODE_INLINE
51058
7c2dc75cdc0f revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51057
diff changeset
3361 if sidedata and self.feature_config.has_side_data:
47256
2b69555e4875 revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47255
diff changeset
3362 sidedata_compression_mode = COMP_MODE_PLAIN
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3363 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata)
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3364 sidedata_offset = self._docket.sidedata_end
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
3365 h, comp_sidedata = self._inner.compress(serialized_sidedata)
47258
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3366 if (
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3367 h != b'u'
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3368 and comp_sidedata[0:1] != b'\0'
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3369 and len(comp_sidedata) < len(serialized_sidedata)
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3370 ):
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3371 assert not h
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3372 if (
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3373 comp_sidedata[0:1]
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3374 == self._docket.default_compression_header
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3375 ):
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3376 sidedata_compression_mode = COMP_MODE_DEFAULT
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3377 serialized_sidedata = comp_sidedata
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3378 else:
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3379 sidedata_compression_mode = COMP_MODE_INLINE
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3380 serialized_sidedata = comp_sidedata
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3381 else:
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3382 serialized_sidedata = b""
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3383 # Don't store the offset if the sidedata is empty, that way
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3384 # we can easily detect empty sidedata and they will be no different
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3385 # than ones we manually add.
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3386 sidedata_offset = 0
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3387
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
3388 rank = RANK_UNKNOWN
51061
81f3877372c3 revlog: remove legacy usage of `_compute_rank`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51058
diff changeset
3389 if self.feature_config.compute_rank:
48765
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3390 if (p1r, p2r) == (nullrev, nullrev):
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3391 rank = 1
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3392 elif p1r != nullrev and p2r == nullrev:
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3393 rank = 1 + self.fast_rank(p1r)
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3394 elif p1r == nullrev and p2r != nullrev:
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3395 rank = 1 + self.fast_rank(p2r)
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3396 else: # merge node
48855
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3397 if rustdagop is not None and self.index.rust_ext_compat:
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3398 rank = rustdagop.rank(self.index, p1r, p2r)
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3399 else:
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3400 pmin, pmax = sorted((p1r, p2r))
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3401 rank = 1 + self.fast_rank(pmax)
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3402 rank += sum(1 for _ in self.findmissingrevs([pmax], [pmin]))
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
3403
47396
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3404 e = revlogutils.entry(
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3405 flags=flags,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3406 data_offset=offset,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3407 data_compressed_length=deltainfo.deltalen,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3408 data_uncompressed_length=textlen,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3409 data_compression_mode=compression_mode,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3410 data_delta_base=deltainfo.base,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3411 link_rev=link,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3412 parent_rev_1=p1r,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3413 parent_rev_2=p2r,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3414 node_id=node,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3415 sidedata_offset=sidedata_offset,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3416 sidedata_compressed_length=len(serialized_sidedata),
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3417 sidedata_compression_mode=sidedata_compression_mode,
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
3418 rank=rank,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3419 )
46704
913485776542 revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46607
diff changeset
3420
38850
6104b203bec8 index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38849
diff changeset
3421 self.index.append(e)
47037
d57386e5c80e revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47036
diff changeset
3422 entry = self.index.entry_binary(curr)
47235
6b1eae313b2f revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47234
diff changeset
3423 if curr == 0 and self._docket is None:
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
3424 header = self._format_flags | self._format_version
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
3425 header = self.index.pack_header(header)
47037
d57386e5c80e revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47036
diff changeset
3426 entry = header + entry
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3427 self._writeentry(
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3428 transaction,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3429 entry,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3430 deltainfo.data,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3431 link,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3432 offset,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3433 serialized_sidedata,
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3434 sidedata_offset,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3435 )
39333
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
3436
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
3437 rawtext = btext[0]
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
3438
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3439 if alwayscache and rawtext is None:
51017
509f0f7fc89e delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51015
diff changeset
3440 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
3441
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3442 if type(rawtext) == bytes: # only accept immutable objects
51093
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
3443 self._inner._revisioncache = (node, curr, rawtext)
39333
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
3444 self._chainbasecache[curr] = deltainfo.chainbase
46506
07984507d553 revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents: 46469
diff changeset
3445 return curr
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
3446
46710
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3447 def _get_data_offset(self, prev):
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3448 """Returns the current offset in the (in-transaction) data file.
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3449 Versions < 2 of the revlog can get this 0(1), revlog v2 needs a docket
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3450 file to store that information: since sidedata can be rewritten to the
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3451 end of the data file within a transaction, you can have cases where, for
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3452 example, rev `n` does not have sidedata while rev `n - 1` does, leading
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3453 to `n - 1`'s sidedata being written after `n`'s data.
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3454
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3455 TODO cache this in a docket file before getting out of experimental."""
47242
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3456 if self._docket is None:
46710
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3457 return self.end(prev)
47242
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3458 else:
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3459 return self._docket.data_end
46710
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3460
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3461 def _writeentry(
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3462 self,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3463 transaction,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3464 entry,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3465 data,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3466 link,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3467 offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3468 sidedata,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3469 sidedata_offset,
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3470 ):
27430
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
3471 # 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
3472 # 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
3473 # 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
3474 # 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
3475 # 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
3476 # 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
3477 # 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
3478 #
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
3479 # We work around this issue by inserting a seek() before writing.
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
3480 # Note: This is likely not necessary on Python 3. However, because
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
3481 # the file handle is reused for reads and may be seeked there, we need
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
3482 # to be careful before changing this.
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3483 index_end = data_end = sidedata_end = None
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3484 if self._docket is not None:
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3485 index_end = self._docket.index_end
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3486 data_end = self._docket.data_end
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3487 sidedata_end = self._docket.sidedata_end
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3488
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3489 files_end = self._inner.write_entry(
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3490 transaction,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3491 entry,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3492 data,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3493 link,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3494 offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3495 sidedata,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3496 sidedata_offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3497 index_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3498 data_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3499 sidedata_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3500 )
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3501 self._enforceinlinesize(transaction)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3502 if self._docket is not None:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3503 self._docket.index_end = files_end[0]
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3504 self._docket.data_end = files_end[1]
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3505 self._docket.sidedata_end = files_end[2]
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3506
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
3507 nodemaputil.setup_persistent_nodemap(transaction, self)
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3508
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3509 def addgroup(
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3510 self,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3511 deltas,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3512 linkmapper,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3513 transaction,
46373
711ba0f1057e revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents: 46310
diff changeset
3514 alwayscache=False,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3515 addrevisioncb=None,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3516 duplicaterevisioncb=None,
49610
35d4c2124073 debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49609
diff changeset
3517 debug_info=None,
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3518 delta_base_reuse_policy=None,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3519 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3520 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3521 add a delta group
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 45
diff changeset
3522
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3523 given a set of deltas, add them to the revision log. the
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3524 first delta is against its parent, which should be in our
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3525 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
3526
00e3f909907f revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
3527 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
3528 this revlog and the node that was added.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3529 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3530
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3531 if self._adding_group:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3532 raise error.ProgrammingError(b'cannot nest addgroup() calls')
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
3533
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3534 # read the default delta-base reuse policy from revlog config if the
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3535 # group did not specify one.
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3536 if delta_base_reuse_policy is None:
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3537 if (
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3538 self.delta_config.general_delta
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3539 and self.delta_config.lazy_delta_base
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3540 ):
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3541 delta_base_reuse_policy = DELTA_BASE_REUSE_TRY
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3542 else:
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3543 delta_base_reuse_policy = DELTA_BASE_REUSE_NO
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3544
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3545 self._adding_group = True
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3546 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
3547 try:
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3548 with self._writing(transaction):
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3549 write_debug = None
51051
ab2bc31fa91f revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51048
diff changeset
3550 if self.delta_config.debug_delta:
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3551 write_debug = transaction._report
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3552 deltacomputer = deltautil.deltacomputer(
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3553 self,
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3554 write_debug=write_debug,
49610
35d4c2124073 debug: add an option to display statistic about a unbundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49609
diff changeset
3555 debug_info=debug_info,
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3556 )
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3557 # loop through our set of deltas
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3558 for data in deltas:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3559 (
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3560 node,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3561 p1,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3562 p2,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3563 linknode,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3564 deltabase,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3565 delta,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3566 flags,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3567 sidedata,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3568 ) = data
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3569 link = linkmapper(linknode)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3570 flags = flags or REVIDX_DEFAULT_FLAGS
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3571
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3572 rev = self.index.get_rev(node)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3573 if rev is not None:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3574 # this can happen if two branches make the same change
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3575 self._nodeduplicatecallback(transaction, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3576 if duplicaterevisioncb:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3577 duplicaterevisioncb(self, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3578 empty = False
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3579 continue
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3580
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3581 for p in (p1, p2):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3582 if not self.index.has_node(p):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3583 raise error.LookupError(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3584 p, self.radix, _(b'unknown parent')
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3585 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3586
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3587 if not self.index.has_node(deltabase):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3588 raise error.LookupError(
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3589 deltabase, self.display_id, _(b'unknown delta base')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3590 )
24120
a450e0a2ba0a revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents: 24118
diff changeset
3591
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3592 baserev = self.rev(deltabase)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3593
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3594 if baserev != nullrev and self.iscensored(baserev):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3595 # if base is censored, delta must be full replacement in a
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3596 # single patch operation
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3597 hlen = struct.calcsize(b">lll")
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3598 oldlen = self.rawsize(baserev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3599 newlen = len(delta) - hlen
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3600 if delta[:hlen] != mdiff.replacediffheader(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3601 oldlen, newlen
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3602 ):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3603 raise error.CensoredBaseError(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3604 self.display_id, self.node(baserev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3605 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3606
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3607 if not flags and self._peek_iscensored(baserev, delta):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3608 flags |= REVIDX_ISCENSORED
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3609
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3610 # We assume consumers of addrevisioncb will want to retrieve
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3611 # the added revision, which will require a call to
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3612 # revision(). revision() will fast path if there is a cache
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3613 # hit. So, we tell _addrevision() to always cache in this case.
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3614 # We're only using addgroup() in the context of changegroup
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3615 # generation so the revision data can always be handled as raw
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3616 # by the flagprocessor.
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3617 rev = self._addrevision(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3618 node,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3619 None,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3620 transaction,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3621 link,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3622 p1,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3623 p2,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3624 flags,
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3625 (baserev, delta, delta_base_reuse_policy),
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3626 alwayscache=alwayscache,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3627 deltacomputer=deltacomputer,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3628 sidedata=sidedata,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3629 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3630
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3631 if addrevisioncb:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3632 addrevisioncb(self, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3633 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
3634 finally:
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3635 self._adding_group = False
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3636 return not empty
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
3637
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
3638 def iscensored(self, rev):
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
3639 """Check if a file revision is censored."""
51047
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
3640 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
3641 return False
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
3642
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
3643 return self.flags(rev) & REVIDX_ISCENSORED
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
3644
47166
c9ae2e7fe154 revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47165
diff changeset
3645 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
3646 """Quickly check if a delta produces a censored revision."""
51047
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
3647 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
3648 return False
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
3649
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40298
diff changeset
3650 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
3651
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3652 def getstrippoint(self, minlink):
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3653 """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
3654
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3655 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
3656 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
3657 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3658 return storageutil.resolvestripinfo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3659 minlink,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3660 len(self) - 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3661 self.headrevs(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3662 self.linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3663 self.parentrevs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3664 )
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3665
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8017
diff changeset
3666 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
3667 """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
3668
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3669 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
3670 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
3671
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3672 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
3673 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
3674 strip.
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3675
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3676 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
3677 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
3678 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
3679 """
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3680 if len(self) == 0:
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3681 return
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3682
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3683 rev, _ = self.getstrippoint(minlink)
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3684 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
3685 return
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3686
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3687 # first truncate the files on disk
47242
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3688 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
3689 if not self._inline:
47242
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3690 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
3691 end = rev * self.index.entry_size
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3692 else:
47242
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3693 end = data_end + (rev * self.index.entry_size)
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2002
diff changeset
3694
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3695 if self._sidedatafile:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3696 sidedata_end = self.sidedata_cut_off(rev)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3697 transaction.add(self._sidedatafile, sidedata_end)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3698
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3699 transaction.add(self._indexfile, end)
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3700 if self._docket is not None:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3701 # XXX we could, leverage the docket while stripping. However it is
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3702 # not powerfull enough at the time of this comment
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3703 self._docket.index_end = end
47242
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
3704 self._docket.data_end = data_end
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3705 self._docket.sidedata_end = sidedata_end
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
3706 self._docket.write(transaction, stripping=True)
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3707
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3708 # then reset internal state in memory to forget those revisions
45779
8719a5b68419 revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents: 45735
diff changeset
3709 self._chaininfocache = util.lrucachedict(500)
51098
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
3710 self._inner.clear_cache()
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3711
4979
06abdaf78788 revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents: 4978
diff changeset
3712 del self.index[rev:-1]
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3713
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
3714 def checksize(self):
41872
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3715 """Check size of index and data files
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3716
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3717 return a (dd, di) tuple.
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3718 - dd: extra bytes for the "data" file
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3719 - di: extra bytes for the "index" file
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3720
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3721 A healthy revlog will return (0, 0).
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3722 """
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
3723 expected = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3724 if len(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3725 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
3726
1494
249ca10d37f4 Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents: 1493
diff changeset
3727 try:
35972
82afb1a5ed94 revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents: 35971
diff changeset
3728 with self._datafp() as f:
42567
4eaf7197a740 cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents: 42462
diff changeset
3729 f.seek(0, io.SEEK_END)
35972
82afb1a5ed94 revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents: 35971
diff changeset
3730 actual = f.tell()
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3731 dd = actual - expected
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
3732 except FileNotFoundError:
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3733 dd = 0
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3734
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3735 try:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3736 f = self.opener(self._indexfile)
42567
4eaf7197a740 cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents: 42462
diff changeset
3737 f.seek(0, io.SEEK_END)
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3738 actual = f.tell()
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13284
diff changeset
3739 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
3740 s = self.index.entry_size
9029
0001e49f1c11 compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents: 8658
diff changeset
3741 i = max(0, actual // s)
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3742 di = actual - (i * s)
4982
9672e3c42b0c revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents: 4981
diff changeset
3743 if self._inline:
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3744 databytes = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3745 for r in self:
5312
fb070713ff36 revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents: 5007
diff changeset
3746 databytes += max(0, self.length(r))
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3747 dd = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3748 di = actual - len(self) * s - databytes
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
3749 except FileNotFoundError:
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3750 di = 0
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3751
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3752 return (dd, di)
6891
22cb82433842 revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents: 6872
diff changeset
3753
22cb82433842 revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents: 6872
diff changeset
3754 def files(self):
51079
808f1e38cd1d revlog: small doc to the `files` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51078
diff changeset
3755 """return list of files that compose this revlog"""
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3756 res = [self._indexfile]
47450
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3757 if self._docket_file is None:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3758 if not self._inline:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3759 res.append(self._datafile)
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3760 else:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3761 res.append(self._docket_file)
47455
f93a867a6486 revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47452
diff changeset
3762 res.extend(self._docket.old_index_filepaths(include_empty=False))
47450
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3763 if self._docket.data_end:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3764 res.append(self._datafile)
47455
f93a867a6486 revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47452
diff changeset
3765 res.extend(self._docket.old_data_filepaths(include_empty=False))
47450
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3766 if self._docket.sidedata_end:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3767 res.append(self._sidedatafile)
47455
f93a867a6486 revlog: list older-but-still-around file in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47452
diff changeset
3768 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
3769 return res
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3770
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3771 def emitrevisions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3772 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3773 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3774 nodesorder=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3775 revisiondata=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3776 assumehaveparentrevisions=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3777 deltamode=repository.CG_DELTAMODE_STD,
46715
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46712
diff changeset
3778 sidedata_helpers=None,
49609
9cac281eb9c0 debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49534
diff changeset
3779 debug_info=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3780 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3781 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
3782 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3783 b'unhandled value for nodesorder: %s' % nodesorder
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3784 )
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
3785
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3786 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
3787 nodesorder = b'storage'
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
3788
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3789 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3790 not self._storedeltachains
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3791 and deltamode != repository.CG_DELTAMODE_PREV
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3792 ):
40427
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
3793 deltamode = repository.CG_DELTAMODE_FULL
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
3794
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3795 return storageutil.emitrevisions(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3796 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3797 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3798 nodesorder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3799 revlogrevisiondelta,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3800 deltaparentfn=self.deltaparent,
51001
39fa0b948f5a revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51000
diff changeset
3801 candeltafn=self._candelta,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3802 rawsizefn=self.rawsize,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3803 revdifffn=self.revdiff,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3804 flagsfn=self.flags,
40427
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
3805 deltamode=deltamode,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3806 revisiondata=revisiondata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3807 assumehaveparentrevisions=assumehaveparentrevisions,
46715
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46712
diff changeset
3808 sidedata_helpers=sidedata_helpers,
49609
9cac281eb9c0 debug: add an option to display statistic about a bundling operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49534
diff changeset
3809 debug_info=debug_info,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3810 )
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
3811
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3812 DELTAREUSEALWAYS = b'always'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3813 DELTAREUSESAMEREVS = b'samerevs'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3814 DELTAREUSENEVER = b'never'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3815
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3816 DELTAREUSEFULLADD = b'fulladd'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3817
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3818 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
3819
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3820 def clone(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3821 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3822 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3823 destrevlog,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3824 addrevisioncb=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3825 deltareuse=DELTAREUSESAMEREVS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3826 forcedeltabothparents=None,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3827 sidedata_helpers=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3828 ):
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3829 """Copy this revlog to another, possibly with format changes.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3830
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3831 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
3832 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
3833 differences.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3834
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3835 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
3836 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
3837 following values:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3838
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3839 DELTAREUSEALWAYS
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3840 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
3841 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
3842 fastest mode of operation.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3843 DELTAREUSESAMEREVS
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3844 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
3845 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
3846 and optimization.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3847 DELTAREUSENEVER
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3848 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
3849 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
3850 algorithm changes).
42997
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
3851 DELTAREUSEFULLADD
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
3852 Revision will be re-added as if their were new content. This is
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
3853 slower than DELTAREUSEALWAYS but allow more mechanism to kicks in.
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
3854 eg: large file detection and handling.
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3855
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3856 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
3857 significantly affect run time.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3858
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3859 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3860 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
3861 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
3862 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
3863 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
3864 revision.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3865
40837
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
3866 In addition to the delta policy, the ``forcedeltabothparents``
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
3867 argument controls whether to force compute deltas against both parents
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
3868 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
3869
47086
8bd769b5c941 sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47085
diff changeset
3870 See `revlogutil.sidedata.get_sidedata_helpers` for the doc on
8bd769b5c941 sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47085
diff changeset
3871 `sidedata_helpers`.
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3872 """
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3873 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
3874 raise ValueError(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3875 _(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
3876 )
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3877
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3878 if len(destrevlog):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3879 raise ValueError(_(b'destination revlog is not empty'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3880
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3881 if getattr(self, 'filteredrevs', None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3882 raise ValueError(_(b'source revlog has filtered revisions'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3883 if getattr(destrevlog, 'filteredrevs', None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3884 raise ValueError(_(b'destination revlog has filtered revisions'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3885
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
3886 # lazydelta and lazydeltabase controls whether to reuse a cached delta,
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
3887 # if possible.
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3888 old_delta_config = destrevlog.delta_config
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3889 destrevlog.delta_config = destrevlog.delta_config.copy()
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3890
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3891 try:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3892 if deltareuse == self.DELTAREUSEALWAYS:
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3893 destrevlog.delta_config.lazy_delta_base = True
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3894 destrevlog.delta_config.lazy_delta = True
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3895 elif deltareuse == self.DELTAREUSESAMEREVS:
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3896 destrevlog.delta_config.lazy_delta_base = False
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3897 destrevlog.delta_config.lazy_delta = True
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
3898 elif deltareuse == self.DELTAREUSENEVER:
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3899 destrevlog.delta_config.lazy_delta_base = False
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3900 destrevlog.delta_config.lazy_delta = False
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3901
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3902 delta_both_parents = (
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3903 forcedeltabothparents or old_delta_config.delta_both_parents
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3904 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3905 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
3906
51111
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3907 with self.reading(), destrevlog._writing(tr):
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3908 self._clone(
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3909 tr,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3910 destrevlog,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3911 addrevisioncb,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3912 deltareuse,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3913 forcedeltabothparents,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3914 sidedata_helpers,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3915 )
42996
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3916
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3917 finally:
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3918 destrevlog.delta_config = old_delta_config
39778
a6b3c4c1019f revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39775
diff changeset
3919
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3920 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
3921 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
3922 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
3923 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
3924 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
3925 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
3926 forcedeltabothparents,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3927 sidedata_helpers,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3928 ):
42996
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3929 """perform the core duty of `revlog.clone` after parameter processing"""
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3930 write_debug = None
51051
ab2bc31fa91f revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51048
diff changeset
3931 if self.delta_config.debug_delta:
49227
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3932 write_debug = tr._report
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3933 deltacomputer = deltautil.deltacomputer(
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3934 destrevlog,
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3935 write_debug=write_debug,
2bcf5e14bb7e deltas: add a `debug.revlog.debug-delta` config option enable output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49012
diff changeset
3936 )
42996
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3937 index = self.index
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3938 for rev in self:
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3939 entry = index[rev]
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3940
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3941 # Some classes override linkrev to take filtered revs into
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3942 # account. Use raw entry from index.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3943 flags = entry[0] & 0xFFFF
42996
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3944 linkrev = entry[4]
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3945 p1 = index[entry[5]][7]
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3946 p2 = index[entry[6]][7]
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3947 node = entry[7]
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3948
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3949 # (Possibly) reuse the delta from the revlog if allowed and
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3950 # the revlog chunk is a delta.
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3951 cachedelta = None
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3952 rawtext = None
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3953 if deltareuse == self.DELTAREUSEFULLADD:
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
3954 text = self._revisiondata(rev)
47384
fec306b05328 revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47382
diff changeset
3955 sidedata = self.sidedata(rev)
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3956
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3957 if sidedata_helpers is not None:
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47084
diff changeset
3958 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers(
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3959 self, sidedata_helpers, sidedata, rev
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3960 )
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3961 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
3962
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3963 destrevlog.addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3964 text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3965 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3966 linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3967 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3968 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3969 cachedelta=cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3970 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3971 flags=flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3972 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
3973 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3974 )
42996
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3975 else:
51063
b79c73a7afce revlog: remove legacy usage of `_lazydelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51062
diff changeset
3976 if destrevlog.delta_config.lazy_delta:
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3977 dp = self.deltaparent(rev)
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3978 if dp != nullrev:
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
3979 cachedelta = (dp, bytes(self._inner._chunk(rev)))
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3980
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3981 sidedata = None
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3982 if not cachedelta:
51110
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3983 try:
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3984 rawtext = self._revisiondata(rev)
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3985 except error.CensoredNodeError as censored:
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3986 assert flags & REVIDX_ISCENSORED
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3987 rawtext = censored.tombstone
47384
fec306b05328 revlog: use `self.sidedata` directly in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47382
diff changeset
3988 sidedata = self.sidedata(rev)
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3989 if sidedata is None:
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3990 sidedata = self.sidedata(rev)
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3991
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3992 if sidedata_helpers is not None:
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47084
diff changeset
3993 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers(
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3994 self, sidedata_helpers, sidedata, rev
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3995 )
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3996 flags = flags | new_flags[0] & ~new_flags[1]
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3997
51111
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3998 destrevlog._addrevision(
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
3999 node,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4000 rawtext,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4001 tr,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4002 linkrev,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4003 p1,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4004 p2,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4005 flags,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4006 cachedelta,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4007 deltacomputer=deltacomputer,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4008 sidedata=sidedata,
315c74911993 revlog: avoid opening and closing the file for each cloned revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51110
diff changeset
4009 )
42996
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
4010
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
4011 if addrevisioncb:
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
4012 addrevisioncb(self, rev, node)
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
4013
40056
324b4b10351e revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40055
diff changeset
4014 def censorrevision(self, tr, censornode, tombstone=b''):
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
4015 if self._format_version == REVLOGV0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4016 raise error.RevlogError(
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
4017 _(b'cannot censor with version %d revlogs')
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
4018 % self._format_version
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4019 )
47391
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
4020 elif self._format_version == REVLOGV1:
47465
bc8536e09a20 revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47463
diff changeset
4021 rewrite.v1_censor(self, tr, censornode, tombstone)
47391
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
4022 else:
47465
bc8536e09a20 revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47463
diff changeset
4023 rewrite.v2_censor(self, tr, censornode, tombstone)
39778
a6b3c4c1019f revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39775
diff changeset
4024
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4025 def verifyintegrity(self, state):
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4026 """Verifies the integrity of the revlog.
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4027
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4028 Yields ``revlogproblem`` instances describing problems that are
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4029 found.
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4030 """
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4031 dd, di = self.checksize()
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4032 if dd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4033 yield revlogproblem(error=_(b'data length off by %d bytes') % dd)
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4034 if di:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4035 yield revlogproblem(error=_(b'index contains %d extra bytes') % di)
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
4036
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
4037 version = self._format_version
39845
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
4038
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
4039 # 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
4040 if version != state[b'expectedversion']:
39845
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
4041 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4042 warning=_(b"warning: '%s' uses revlog format %d; expected %d")
47157
3a9f3470922c revlog: use revlog.display_id in format related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47155
diff changeset
4043 % (self.display_id, version, state[b'expectedversion'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4044 )
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4045
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4046 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
4047 state[b'safe_renamed'] = set()
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4048
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4049 for rev in self:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4050 node = self.node(rev)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4051
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4052 # Verify contents. 4 cases to care about:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4053 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4054 # common: the most common case
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4055 # rename: with a rename
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4056 # meta: file content starts with b'\1\n', the metadata
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4057 # header defined in filelog.py, but without a rename
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4058 # ext: content stored externally
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4059 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4060 # More formally, their differences are shown below:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4061 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4062 # | common | rename | meta | ext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4063 # -------------------------------------------------------
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4064 # flags() | 0 | 0 | 0 | not 0
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4065 # renamed() | False | True | False | ?
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4066 # rawtext[0:2]=='\1\n'| False | True | True | ?
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4067 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4068 # "rawtext" means the raw text stored in revlog data, which
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
4069 # could be retrieved by "rawdata(rev)". "text"
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
4070 # mentioned below is "revision(rev)".
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4071 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4072 # There are 3 different lengths stored physically:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4073 # 1. L1: rawsize, stored in revlog index
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4074 # 2. L2: len(rawtext), stored in revlog data
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4075 # 3. L3: len(text), stored in revlog data if flags==0, or
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4076 # possibly somewhere else if flags!=0
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4077 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4078 # L1 should be equal to L2. L3 could be different from them.
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4079 # "text" may or may not affect commit hash depending on flag
42732
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
4080 # processors (see flagutil.addflagprocessor).
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4081 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4082 # | common | rename | meta | ext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4083 # -------------------------------------------------
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4084 # rawsize() | L1 | L1 | L1 | L1
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4085 # size() | L1 | L2-LM | L1(*) | L1 (?)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4086 # len(rawtext) | L2 | L2 | L2 | L2
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4087 # len(text) | L2 | L2 | L2 | L3
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4088 # len(read()) | L2 | L2-LM | L2-LM | L3 (?)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4089 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4090 # LM: length of metadata, depending on rawtext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4091 # (*): not ideal, see comment in filelog.size
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4092 # (?): could be "- len(meta)" if the resolved content has
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4093 # rename metadata
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4094 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4095 # Checks needed to be done:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4096 # 1. length check: L1 == L2, in all cases.
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4097 # 2. hash check: depending on flag processor, we may need to
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4098 # use either "text" (external), or "rawtext" (in revlog).
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4099
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4100 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4101 skipflags = state.get(b'skipflags', 0)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4102 if skipflags:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4103 skipflags &= self.flags(rev)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4104
43957
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
4105 _verify_revision(self, skipflags, state, node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4106
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4107 l1 = self.rawsize(rev)
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
4108 l2 = len(self.rawdata(node))
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4109
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4110 if l1 != l2:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4111 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4112 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
4113 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4114 )
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4115
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4116 except error.CensoredNodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4117 if state[b'erroroncensored']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4118 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4119 error=_(b'censored file data'), node=node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4120 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4121 state[b'skipread'].add(node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4122 except Exception as e:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4123 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4124 error=_(b'unpacking %s: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4125 % (short(node), stringutil.forcebytestr(e)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4126 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4127 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4128 state[b'skipread'].add(node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
4129
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4130 def storageinfo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4131 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4132 exclusivefiles=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4133 sharedfiles=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4134 revisionscount=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4135 trackedsize=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4136 storedsize=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4137 ):
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4138 d = {}
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4139
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4140 if exclusivefiles:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
4141 d[b'exclusivefiles'] = [(self.opener, self._indexfile)]
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4142 if not self._inline:
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
4143 d[b'exclusivefiles'].append((self.opener, self._datafile))
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4144
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4145 if sharedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4146 d[b'sharedfiles'] = []
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4147
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4148 if revisionscount:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4149 d[b'revisionscount'] = len(self)
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4150
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4151 if trackedsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4152 d[b'trackedsize'] = sum(map(self.rawsize, iter(self)))
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4153
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4154 if storedsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
4155 d[b'storedsize'] = sum(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
4156 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
4157 )
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4158
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
4159 return d
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4160
47216
2bd4b5218918 revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47215
diff changeset
4161 def rewrite_sidedata(self, transaction, helpers, startrev, endrev):
51058
7c2dc75cdc0f revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51057
diff changeset
4162 if not self.feature_config.has_side_data:
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4163 return
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
4164 # revlog formats with sidedata support does not support inline
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4165 assert not self._inline
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4166 if not helpers[1] and not helpers[2]:
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4167 # Nothing to generate or remove
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4168 return
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4169
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4170 new_entries = []
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4171 # append the new sidedata
47218
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
4172 with self._writing(transaction):
51083
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
4173 ifh, dfh, sdfh = self._inner._writinghandles
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
4174 dfh.seek(self._docket.sidedata_end, os.SEEK_SET)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
4175
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
4176 current_offset = sdfh.tell()
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4177 for rev in range(startrev, endrev + 1):
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4178 entry = self.index[rev]
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47084
diff changeset
4179 new_sidedata, flags = sidedatautil.run_sidedata_helpers(
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4180 store=self,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4181 sidedata_helpers=helpers,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4182 sidedata={},
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4183 rev=rev,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4184 )
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4185
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4186 serialized_sidedata = sidedatautil.serialize_sidedata(
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4187 new_sidedata
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4188 )
47259
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4189
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4190 sidedata_compression_mode = COMP_MODE_INLINE
51058
7c2dc75cdc0f revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51057
diff changeset
4191 if serialized_sidedata and self.feature_config.has_side_data:
47259
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4192 sidedata_compression_mode = COMP_MODE_PLAIN
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
4193 h, comp_sidedata = self._inner.compress(serialized_sidedata)
47259
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4194 if (
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4195 h != b'u'
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4196 and comp_sidedata[0] != b'\0'
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4197 and len(comp_sidedata) < len(serialized_sidedata)
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4198 ):
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4199 assert not h
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4200 if (
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4201 comp_sidedata[0]
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4202 == self._docket.default_compression_header
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4203 ):
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4204 sidedata_compression_mode = COMP_MODE_DEFAULT
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4205 serialized_sidedata = comp_sidedata
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4206 else:
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4207 sidedata_compression_mode = COMP_MODE_INLINE
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4208 serialized_sidedata = comp_sidedata
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4209 if entry[8] != 0 or entry[9] != 0:
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4210 # rewriting entries that already have sidedata is not
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4211 # supported yet, because it introduces garbage data in the
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4212 # revlog.
47228
e51392acd70c revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47222
diff changeset
4213 msg = b"rewriting existing sidedata is not supported yet"
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4214 raise error.Abort(msg)
47078
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4215
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4216 # Apply (potential) flags to add and to remove after running
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4217 # the sidedata helpers
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4218 new_offset_flags = entry[0] | flags[0] & ~flags[1]
47245
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4219 entry_update = (
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4220 current_offset,
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4221 len(serialized_sidedata),
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4222 new_offset_flags,
47259
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4223 sidedata_compression_mode,
47245
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4224 )
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4225
47217
8f6165c90163 revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47216
diff changeset
4226 # the sidedata computation might have move the file cursors around
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
4227 sdfh.seek(current_offset, os.SEEK_SET)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
4228 sdfh.write(serialized_sidedata)
47245
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4229 new_entries.append(entry_update)
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4230 current_offset += len(serialized_sidedata)
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
4231 self._docket.sidedata_end = sdfh.tell()
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4232
47218
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
4233 # rewrite the new index entries
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
4234 ifh.seek(startrev * self.index.entry_size)
47078
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4235 for i, e in enumerate(new_entries):
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4236 rev = startrev + i
47245
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4237 self.index.replace_sidedata_info(rev, *e)
47037
d57386e5c80e revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47036
diff changeset
4238 packed = self.index.entry_binary(rev)
47235
6b1eae313b2f revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47234
diff changeset
4239 if rev == 0 and self._docket is None:
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
4240 header = self._format_flags | self._format_version
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
4241 header = self.index.pack_header(header)
47037
d57386e5c80e revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47036
diff changeset
4242 packed = header + packed
47215
042388bba644 revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47214
diff changeset
4243 ifh.write(packed)