annotate mercurial/revlog.py @ 51187:6ec8387eb0be

rust-index: pass data down to the Rust index This will allow us to start keeping the Rust index synchronized with the cindex as we gradually implement more and more methods in Rust. This will eventually be removed.
author Rapha?l Gom?s <rgomes@octobus.net>
date Tue, 27 Jun 2023 17:34:51 +0200
parents a93e52f0b6ff
children 13f58ce70299
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)
51187
6ec8387eb0be rust-index: pass data down to the Rust index
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51179
diff changeset
229 return rustrevlog.MixedIndex(index, data), 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
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
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
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
419 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
420 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
421
51098
045b5f745f93 revlog: consolidate cache invalidation within the inner objet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51096
diff changeset
422 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
423 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
424 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
425 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
426 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
427 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
428 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
429
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
430 @property
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
431 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
432 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
433 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
434 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
435
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
436 @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
437 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
438 """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
439
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
440 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
441 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
442 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
443 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
444 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
445
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
446 # 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
447
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
448 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
449 """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
450 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
451
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
452 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
453 """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
454 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
455
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 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
457 """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
458 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
459
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
460 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
461 """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
462 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
463 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
464 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
465 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
466 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
467 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
468 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
469
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 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
471 """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
472 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
473 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
474 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
475 # 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
476 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
477 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
478 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
479 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
480 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
481 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
482 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
483 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
484 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
485 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
486 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
487 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
488 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
489 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
490 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
491 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
492 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
493 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
494 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
495 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
496 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
497 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
498 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
499 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
500 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
501
51092
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
502 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
503 """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
504
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
505 ``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
506 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
507
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
508 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
509 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
510 ``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
511 """
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
512 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
513 # 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
514 try:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
515 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
516 except AttributeError:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
517 pass
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
518
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
519 chain = []
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
520
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
521 # 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
522 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
523
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
524 iterrev = rev
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
525 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
526 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
527 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
528 if generaldelta:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
529 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
530 else:
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
531 iterrev -= 1
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
532 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
533
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
534 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
535 stopped = True
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
536 else:
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 stopped = False
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
539
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
540 chain.reverse()
30f458fc59e9 revlog: move the `deltachain` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51091
diff changeset
541 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
542
51088
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
543 @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
544 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
545 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
546 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
547 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
548 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
549
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
550 @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
551 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
552 """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
553 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
554 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
555 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
556 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
557 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
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 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
560 try:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
561 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
562 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
563 try:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
564 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
565 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
566 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
567 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
568 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
569 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
570 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
571 _(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
572 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
573 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
574
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
575 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
576 """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
577 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
578 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
579
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
580 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
581
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
582 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
583 # 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
584 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
585
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
586 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
587 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
588 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
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 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
591 """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
592
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 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
594 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
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 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
597 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
598
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
599 # 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
600 # 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
601 # 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
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 # 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
604 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
605 # 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
606 # 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
607 # 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
608 # 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
609 # 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
610 # engines
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
611 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
612 # 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
613 # 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
614 # 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
615 # 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
616 # 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
617 #
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
618 # 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
619 # 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
620 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
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 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
623 try:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
624 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
625 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
626 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
627 _(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
628 % 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
629 )
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
630 # '\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
631 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
632 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
633 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
634 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
635
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
636 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
637
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
638 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
639
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
640 @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
641 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
642 """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
643 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
644 yield # nothing to be read
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
645 elif self._delay_buffer is not None and self.inline:
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
646 msg = "revlog with delayed write should not be inline"
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
647 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
648 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
649 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
650 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
651 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
652
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 @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
654 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
655 """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
656 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
657
51099
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
658 @property
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
659 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
660 """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
661
594f912818ab changelog-delay: adds some check around delaying and diverting write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51098
diff changeset
662 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
663 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
664
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
665 @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
666 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
667 """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
668
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
669 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
670 """
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
671 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
672 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
673 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
674 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
675 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
676 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
677 # 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
678 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
679 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
680 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
681 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
682 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
683 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
684 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
685 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
686 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
687 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
688 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
689 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
690 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
691 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
692 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
693 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
694 # 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
695 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
696 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
697 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
698 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
699 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
700 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
701 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
702
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 # 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
704 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
705 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
706 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
707 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
708 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
709 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
710 # 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
711 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
712 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
713 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
714 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
715 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
716 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
717 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
718 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
719 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
720 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
721 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
722 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
723 # 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
724 # 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
725 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
726 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
727
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 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
729 """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
730
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 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
732 """
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 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
734 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
735 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
736 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
737 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
738 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
739 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
740 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
741 # 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
742 # 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
743 # 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
744 # 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
745 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
746 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
747 )
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
748 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
749 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
750 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
751 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
752 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
753 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
754 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
755 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
756 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
757 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
758 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
759 )
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
760 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
761 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
762 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
763 )
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
764
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
765 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
766 """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
767
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
768 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
769 """
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
770 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
771 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
772 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
773 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
774 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
775 )
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
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
777 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
778 """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
779 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
780 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
781 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
782 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
783 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
784 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
785 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
786 # 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
787 # 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
788 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
789 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
790 # 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
791 # 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
792 # 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
793
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 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
795 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
796 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
797 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
798 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
799 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
800 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
801
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 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
803 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
804 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
805 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
806 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
807 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
808 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
809 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
810 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
811 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
812
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 # 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
814 # 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
815
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 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
817 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
818 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
819 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
820 )
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
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 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
823 # 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
824 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
825 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
826 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
827 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
828 # 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
829 # 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
830 # 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
831 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
832 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
833 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
834 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
835
51084
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
836 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
837 """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
838
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
839 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
840 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
841 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
842
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
843 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
844
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
845 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
846 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
847 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
848
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
849 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
850 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
851
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
852 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
853 at some point.
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
854 """
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
855 # 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
856 # (functions are expensive).
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
857 index = self.index
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
858 istart = index[startrev]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
859 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
860 if startrev == endrev:
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
861 end = start + istart[1]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
862 else:
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
863 iend = index[endrev]
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
864 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
865
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
866 if self.inline:
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
867 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
868 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
869 length = end - start
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
870
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
871 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
872
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
873 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
874 """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
875
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
876 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
877 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
878 be preserved.
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
879
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
880 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
881 """
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
882 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
883 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
884 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
885 return uncomp
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
886
51089
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
887 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
888 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
889 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
890 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
891 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
892 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
893 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
894 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
895 else:
9c8df10ea6e0 revlog: move the `_chunk` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51088
diff changeset
896 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
897 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
898 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
899 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
900 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
901 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
902
51091
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
903 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
904 """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
905
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
906 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
907 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
908 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
909 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
910
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
911 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
912 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
913
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
914 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
915 """
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
916 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
917 return []
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
918 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
919 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
920 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
921 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
922 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
923
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
924 fetched_revs = []
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
925 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
926
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
927 chunks = []
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
928 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
929
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
930 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
931 fetched_revs = revs
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
932 else:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
933 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
934 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
935 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
936 fadd(rev)
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
937 else:
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
938 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
939
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
940 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
941 slicedchunks = ()
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
942 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
943 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
944 else:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
945 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
946 self,
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
947 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
948 targetsize=targetsize,
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
949 )
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
950
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
951 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
952 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
953 # 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
954 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
955 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
956 break
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 try:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
959 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
960 except OverflowError:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
961 # 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
962 # 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
963 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
964 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
965
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
966 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
967 # 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
968 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
969 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
970 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
971 if inline:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
972 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
973 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
974 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
975 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
976 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
977 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
978 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
979 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
980 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
981 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
982 else:
e8ad6d8de8b8 revlog: move the `_chunks` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51090
diff changeset
983 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
984 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
985 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
986 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
987 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
988 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
989
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
990 chunks.sort()
51104
c2d2e5b65def revlog: minor refactor in the chunk gather process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51103
diff changeset
991 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
992
51094
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
993 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
994 """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
995
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
996 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
997 """
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
998
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
999 # 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
1000 cachedrev = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1001 # 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
1002 basetext = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1003
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1004 # 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
1005 # 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
1006 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
1007 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
1008
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1009 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
1010 if stopped:
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1011 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
1012
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1013 # 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
1014 # 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
1015 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
1016
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1017 targetsize = None
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1018 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
1019 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
1020 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
1021
51105
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
1022 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
1023 # 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
1024 # 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
1025 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
1026 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
1027 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
1028 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
1029
51094
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1030 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
1031 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
1032 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
1033 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
1034
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
1035 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
1036 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
1037 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
1038
51095
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1039 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
1040 """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
1041 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
1042 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
1043 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
1044
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1045 if self.inline:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1046 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
1047 if sidedata_size == 0:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1048 return {}
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1049
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1050 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
1051 filename = self.sidedata_file
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1052 end = sidedata_end
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1053 offset = sidedata_offset
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1054 length = sidedata_size
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1055 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
1056 raise error.RevlogError(m)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1057
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1058 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
1059 sidedata_offset, sidedata_size
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1060 )
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1061
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1062 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
1063 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
1064 segment = comp_segment
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1065 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
1066 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
1067 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
1068 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
1069 else:
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1070 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
1071 msg %= comp
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1072 raise error.RevlogError(msg)
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1073
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1074 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
1075 return sidedata
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
1076
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1077 def write_entry(
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1078 self,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1079 transaction,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1080 entry,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1081 data,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1082 link,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1083 offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1084 sidedata,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1085 sidedata_offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1086 index_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1087 data_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1088 sidedata_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1089 ):
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1090 # 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
1091 # 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
1092 # 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
1093 # 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
1094 # 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
1095 # 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
1096 # 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
1097 #
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1098 # 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
1099 # 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
1100 # 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
1101 # 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
1102 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
1103 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
1104 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
1105 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
1106 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
1107 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
1108 else:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1109 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
1110 if dfh:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1111 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
1112 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
1113 else:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1114 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
1115 if sdfh:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1116 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
1117
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1118 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
1119 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
1120 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
1121 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
1122 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
1123 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
1124 if data[0]:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1125 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
1126 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
1127 if sidedata:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1128 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
1129 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
1130 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
1131 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
1132 self._delay_buffer.append(entry)
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1133 elif self._delay_buffer is not None:
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1134 msg = b'invalid delayed write on inline revlog'
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1135 raise error.ProgrammingError(msg)
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1136 else:
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1137 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
1138 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
1139 assert not sidedata
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1140 ifh.write(entry)
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1141 ifh.write(data[0])
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1142 ifh.write(data[1])
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1143 return (
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1144 ifh.tell(),
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1145 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
1146 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
1147 )
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
1148
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
1149 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
1150 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
1151
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1152 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
1153 assert not self.is_open
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1154 if self.inline:
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1155 msg = "revlog with delayed write should not be inline"
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1156 raise error.ProgrammingError(msg)
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
1157 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
1158 # 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
1159 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
1160 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
1161 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
1162 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
1163 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
1164 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
1165 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
1166 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
1167 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
1168 else:
51162
66417f55ea33 revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51161
diff changeset
1169 self._delay_buffer = []
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1170 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
1171
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 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
1173 assert not self.is_open
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1174 if self.inline:
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1175 msg = "revlog with delayed write should not be inline"
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1176 raise error.ProgrammingError(msg)
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
1177 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
1178 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
1179 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
1180 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
1181 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
1182 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
1183 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
1184 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
1185 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
1186 )
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 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
1188 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
1189 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
1190 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
1191 any_pending = True
51162
66417f55ea33 revlog: avoid exposing delayed index entry too widely in non-inline revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51161
diff changeset
1192 self._delay_buffer = None
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1193 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
1194 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
1195 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
1196
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 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
1198 assert not self.is_open
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1199 if self.inline:
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1200 msg = "revlog with delayed write should not be inline"
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1201 raise error.ProgrammingError(msg)
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1202
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 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
1204 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
1205
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1206 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
1207 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
1208 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
1209 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
1210 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
1211 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
1212 ifh.write(b"".join(self._delay_buffer))
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
1213 self._delay_buffer = None
51103
d83d788590a8 changelog-delay: move the delay/divert logic inside the (inner) revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51102
diff changeset
1214 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
1215 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
1216 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
1217 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._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
1219 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
1220 )
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 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
1222 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
1223 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
1224 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
1225 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
1226 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
1227
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
1228
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48928
diff changeset
1229 class revlog:
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1230 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1231 the underlying revision storage object
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1232
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1233 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
1234
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1235 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
1236 information on each revision, including its nodeid (hash), the
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1237 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
1238 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
1239 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
1240 data.
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1241
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1242 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
1243 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
1244 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
1245 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
1246 version data. This makes retrieval of a version proportional to
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1247 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
1248
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1249 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
1250 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
1251 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
1252 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
1253
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
1254 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
1255 writing, to avoid file stat ambiguity.
34296
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
1256
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
1257 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
1258 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
1259 configured threshold.
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1260
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1261 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
1262
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42452
diff changeset
1263 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
1264 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
1265
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1266 `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
1267 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
1268 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
1269 raising).
47246
02a4463565ea revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47245
diff changeset
1270
47393
7a0ec25d5836 revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47391
diff changeset
1271 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
1272 index entry.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1273 """
42994
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
1274
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
1275 _flagserrorclass = error.RevlogError
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
1276
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1277 @staticmethod
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1278 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
1279 """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
1280 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
1281 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
1282
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1283 header = INDEX_HEADER.unpack(header_bytes)[0]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1284
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1285 _format_flags = header & ~0xFFFF
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1286 _format_version = header & 0xFFFF
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 features = FEATURES_BY_VERSION[_format_version]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1289 return features[b'inline'](_format_flags)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1290
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1291 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1292 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1293 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
1294 target,
47150
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1295 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
1296 postfix=None, # only exist for `tmpcensored` now
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1297 checkambig=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1298 mmaplargeindex=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1299 censorable=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1300 upperboundcomp=None,
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
1301 persistentnodemap=False,
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1302 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
1303 trypending=False,
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
1304 try_split=False,
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1305 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
1306 data_config=None,
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1307 delta_config=None,
c136c797740e revlog: allow explicit passing of config to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51115
diff changeset
1308 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
1309 may_inline=True, # may inline new revlog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1310 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1311 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1312 create a revlog object
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1313
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1314 opener is a function that abstracts the file opening operation
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1315 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
1316
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
1317 `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
1318 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
1319 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
1320 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
1321 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
1322 accurate value.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1323 """
47150
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1324
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1325 self.radix = radix
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
1326
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1327 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
1328 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
1329 self._datafile = None
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1330 self._sidedatafile = None
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1331 self._nodemap_file = None
47145
c6b8d5d91e73 revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47144
diff changeset
1332 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
1333 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
1334 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
1335 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
1336 self.opener = opener
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
1337 if persistentnodemap:
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1338 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
1339
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
1340 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
1341 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
1342 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
1343 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
1344 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
1345 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
1346 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
1347 else:
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1348 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
1349 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
1350 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
1351 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
1352 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
1353 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
1354 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
1355 else:
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1356 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
1357 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
1358 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
1359 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
1360 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
1361 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
1362 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
1363 else:
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51027
diff changeset
1364 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
1365 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
1366
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
1367 # 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
1368 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
1369
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
1370 self.index = None
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1371 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
1372 self._nodemap_docket = None
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1373 # 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
1374 self._pcache = {}
4985
e6525e459157 revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents: 4984
diff changeset
1375
49663
45d7b8c380d7 changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49657
diff changeset
1376 # 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
1377
39768
7b2b42fc377a revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39767
diff changeset
1378 # 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
1379 # 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
1380 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
1381 # 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
1382 self._adding_group = None
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
1383
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
1384 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
1385 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
1386 self._concurrencychecker = concurrencychecker
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
1387
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1388 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
1389 """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
1390
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1391 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
1392
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1393 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
1394
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1395 * newversionflags:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1396 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
1397
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1398 * mmapindexthreshold:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1399 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
1400
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1401 * force_nodemap:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1402 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
1403 """
43025
3518da504303 vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
1404 opts = self.opener.options
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1405
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
1406 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
1407 new_header = CHANGELOGV2
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1408 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
1409 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
1410 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
1411 new_header = REVLOGV2
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1412 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
1413 new_header = REVLOGV1
e9eac01c57f3 revlog: add a `may_inline` argument to revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51154
diff changeset
1414 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
1415 new_header |= FLAG_INLINE_DATA
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1416 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
1417 new_header |= FLAG_GENERALDELTA
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1418 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
1419 new_header = REVLOGV0
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1420 else:
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1421 new_header = REVLOG_DEFAULT_VERSION
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1422
51039
027bc364524b revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51038
diff changeset
1423 mmapindexthreshold = None
51046
3977068c638c revlog: remove legacy usage of `_mmaplargeindex`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51045
diff changeset
1424 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
1425 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
1426 if self.feature_config.enable_ellipsis:
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1427 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1428
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
1429 # revlog v0 doesn't have flag processors
48928
ceafb0f81250 revlog: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
1430 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
1431 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
1432
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1433 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
1434 if chunk_cache_size <= 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1435 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
1436 _(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
1437 % chunk_cache_size
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1438 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1439 elif chunk_cache_size & (chunk_cache_size - 1):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1440 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
1441 _(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
1442 % chunk_cache_size
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1443 )
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
1444 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
1445 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
1446
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1447 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
1448 """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
1449
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1450 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
1451 try:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1452 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
1453 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
1454 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
1455 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
1456 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
1457 # 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
1458 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
1459 # 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
1460 # 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
1461 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
1462 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
1463 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1464 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
1465 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
1466 return fp.read()
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1467 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1468 return fp.read(size)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
1469 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
1470 return b''
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
1471
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1472 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
1473 """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
1474
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1475 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
1476
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1477 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
1478 to `max_linkrev`.
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1479
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1480 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
1481
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1482 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
1483
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1484 [
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1485 (filename, bytes_stream, stream_size),
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1486 …
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1487 ]
273434748051 revlog: document the `get_streams` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50999
diff changeset
1488 """
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1489 n = len(self)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1490 index = self.index
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1491 while n > 0:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1492 linkrev = index[n - 1][4]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1493 if linkrev < max_linkrev:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1494 break
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1495 # 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
1496 # 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
1497 # pull operation.
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1498 #
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1499 # 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
1500 # runtime of this.
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1501 n = n - 1
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1502 if n == 0:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1503 # no data to send
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1504 return []
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1505 index_size = n * index.entry_size
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1506 data_size = self.end(n - 1)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1507
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1508 # 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
1509 # 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
1510 # 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
1511 # we are done streaming.
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1512
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1513 if self._inline:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1514
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1515 def get_stream():
51078
5ffee3cff8de revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51077
diff changeset
1516 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
1517 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1518 size = index_size + data_size
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1519 if size <= 65536:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1520 yield fp.read(size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1521 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1522 yield from util.filechunkiter(fp, limit=size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1523
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1524 inline_stream = get_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1525 next(inline_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1526 return [
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1527 (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
1528 ]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1529 elif force_inline:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1530
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1531 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
1532 with self.reading():
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1533 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1534
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1535 for rev in range(n):
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1536 idx = self.index.entry_binary(rev)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1537 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
1538 # re-inject the inline flag
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1539 header = self._format_flags
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1540 header |= self._format_version
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1541 header |= FLAG_INLINE_DATA
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1542 header = self.index.pack_header(header)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1543 idx = header + idx
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1544 yield idx
51084
df50a1592e0c revlog: move _getsegmentforrevs on the internal object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51083
diff changeset
1545 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
1546
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1547 inline_stream = get_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1548 next(inline_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1549 return [
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1550 (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
1551 ]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1552 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1553
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1554 def get_index_stream():
51078
5ffee3cff8de revlog: remove the `_indexfp` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51077
diff changeset
1555 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
1556 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1557 if index_size <= 65536:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1558 yield fp.read(index_size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1559 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1560 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
1561
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1562 def get_data_stream():
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1563 with self._datafp() as fp:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1564 yield None
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1565 if data_size <= 65536:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1566 yield fp.read(data_size)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1567 else:
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1568 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
1569
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1570 index_stream = get_index_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1571 next(index_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1572 data_stream = get_data_stream()
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1573 next(data_stream)
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1574 return [
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1575 (self._datafile, data_stream, data_size),
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1576 (self._indexfile, index_stream, index_size),
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1577 ]
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1578
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1579 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
1580
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
1581 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
1582
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
1583 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
1584 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
1585 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
1586 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
1587 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
1588 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
1589 else:
47175
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1590 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
1591
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1592 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
1593 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
1594 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
1595 else:
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1596 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
1597 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
1598 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
1599 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
1600 self._initempty = False
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1601 else:
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1602 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
1603
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1604 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
1605 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
1606
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1607 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
1608 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
1609 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
1610 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
1611 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
1612 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
1613 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
1614 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
1615 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
1616 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
1617
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1618 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
1619 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
1620 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
1621 self._format_flags
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1622 )
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
1623 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
1624
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1625 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
1626 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
1627 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
1628 else:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1629 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
1630 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
1631 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
1632 else:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1633 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
1634 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
1635 )
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1636
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
1637 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
1638 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
1639 index_data = b''
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1640 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
1641 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
1642 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
1643 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
1644 )
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
1645 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
1646 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
1647 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
1648 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
1649
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1650 self._inline = False
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
1651 # 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
1652 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
1653 # 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
1654 # 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
1655 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
1656
47324
0a3fa41fa719 revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47294
diff changeset
1657 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
1658 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
1659 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
1660 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
1661 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
1662 else:
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
1663 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
1664
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
1665 self.nodeconstants = sha1nodeconstants
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
1666 self.nullid = self.nodeconstants.nullid
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
1667
41447
189e06b2d719 revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents: 41350
diff changeset
1668 # 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
1669 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
1670 self.delta_config.sparse_revlog = False
4985
e6525e459157 revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents: 4984
diff changeset
1671
39232
0a5b20c107a6 repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39231
diff changeset
1672 self._storedeltachains = True
30154
5e72129d75ed revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30012
diff changeset
1673
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
1674 devel_nodemap = (
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1675 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
1676 and force_nodemap
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1677 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
1678 )
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
1679
44513
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1680 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
1681 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
1682 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
1683 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
1684 else:
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
1685 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
1686
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1687 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
1688 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
1689 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
1690 elif self._format_version == REVLOGV2:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1691 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
1692 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
1693 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
1694 elif devel_nodemap:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1695 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
1696 elif use_rust_index:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
1697 self._parse_index = parse_index_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
1698 try:
47176
8b549ea4bebf revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47175
diff changeset
1699 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
1700 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
1701 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
1702 not self._inline
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1703 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
1704 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
1705 )
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
1706 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
1707 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
1708 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
1709 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
1710 if (
affe0fb42250 nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44516
diff changeset
1711 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
1712 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
1713 ):
44515
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1714 # no changelog tampering
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1715 self._nodemap_docket = docket
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
1716 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
1717 except (ValueError, IndexError):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1718 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
1719 _(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
1720 )
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
1721 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
1722 # revnum -> (chain-length, sum-delta-length)
45779
8719a5b68419 revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents: 45735
diff changeset
1723 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
1724
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
1725 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
1726
c3748f38dcd0 revlog: create a iteration of a _InnerRevlog object within the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51082
diff changeset
1727 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
1728 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
1729 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
1730 else:
a82704902db8 revlog: move the compression/decompression logic on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51087
diff changeset
1731 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
1732
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
1733 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
1734 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
1735 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
1736 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
1737 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
1738 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
1739 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
1740 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
1741 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
1742 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
1743 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
1744 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
1745 )
116
e484cd5ec282 Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents: 115
diff changeset
1746
50683
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1747 def get_revlog(self):
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1748 """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
1749 return self
a41eeb877d07 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50659
diff changeset
1750
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
1751 @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
1752 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
1753 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
1754
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
1755 @util.propertycache
47153
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
1756 def display_id(self):
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
1757 """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
1758 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
1759 # 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
1760 # 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
1761 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
1762 else:
92892dff03f3 revlog: use the user facing filename as the display_id for filelogs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49533
diff changeset
1763 return self.radix
47153
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
1764
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1765 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
1766 """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
1767 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
1768
43440
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1769 def tiprev(self):
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1770 return len(self.index) - 1
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1771
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1772 def tip(self):
43440
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
1773 return self.node(self.tiprev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1774
24030
828dc8db5515 revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents: 23857
diff changeset
1775 def __contains__(self, rev):
828dc8db5515 revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents: 23857
diff changeset
1776 return 0 <= rev < len(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1777
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1778 def __len__(self):
38851
781b2720d2ac index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38850
diff changeset
1779 return len(self.index)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1780
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1781 def __iter__(self):
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49248
diff changeset
1782 return iter(range(len(self)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1783
17672
474047947b8f clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17537
diff changeset
1784 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
1785 """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
1786 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
1787
16374
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1788 def hasnode(self, node):
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1789 try:
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1790 self.rev(node)
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1791 return True
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1792 except KeyError:
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1793 return False
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
1794
51001
39fa0b948f5a revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51000
diff changeset
1795 def _candelta(self, baserev, rev):
36743
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1796 """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
1797 # 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
1798 # 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
1799 # 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
1800 # 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
1801 # rawtext contents) and the delta could be incompatible.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1802 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1803 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1804 ):
36743
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1805 return False
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1806 return True
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
1807
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
1808 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
1809 """update on disk cache
569eb5d0420d revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51001
diff changeset
1810
569eb5d0420d revlog: document the `update_caches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51001
diff changeset
1811 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
1812 commit."""
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1813 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
1814 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
1815 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
1816 else:
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
1817 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
1818
16414
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16375
diff changeset
1819 def clearcaches(self):
51003
6c3798b4597f revlog: document the `clearcaches` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51002
diff changeset
1820 """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
1821 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
1822 self._inner.clear_cache()
27465
072a675c51f2 revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27449
diff changeset
1823 self._pcache = {}
44501
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
1824 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
1825 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
1826 # 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
1827 # 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
1828 use_nodemap = (
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
1829 not self._inline
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
1830 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
1831 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
1832 )
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
1833 if use_nodemap:
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
1834 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
1835 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
1836 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
1837 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
1838
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
1839 def rev(self, node):
51004
ccddd2f54013 revlog: document the `rev` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51003
diff changeset
1840 """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
1841 try:
43553
2da51e292734 index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43552
diff changeset
1842 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
1843 except TypeError:
4092d12ba18a repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents: 21752
diff changeset
1844 raise
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
1845 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
1846 # 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
1847 if (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1848 node == self.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1849 or node in self.nodeconstants.wdirfilenodeids
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1850 ):
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
1851 raise error.WdirUnsupported
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
1852 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
1853
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1854 # Accessors for index entries.
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1855
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1856 # 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
1857 # are flags.
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2002
diff changeset
1858 def start(self, rev):
5006
c2febf5420e9 revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents: 5005
diff changeset
1859 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
1860
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1861 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
1862 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
1863 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
1864 return sd_cut_off
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1865 # 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
1866 # 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
1867 # previous-size)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1868 #
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1869 # 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
1870 # 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
1871 while 0 <= rev:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1872 e = self.index[rev]
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1873 if e[9] != 0:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1874 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
1875 rev -= 1
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1876 return 0
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
1877
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1878 def flags(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1879 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
1880
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1881 def length(self, rev):
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1882 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
1883
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
1884 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
1885 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
1886 return 0
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
1887 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
1888
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1889 def rawsize(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1890 """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
1891 l = self.index[rev][2]
38177
7fa3408f83ef revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents: 38169
diff changeset
1892 if l >= 0:
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1893 return l
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1894
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
1895 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
1896 return len(t)
31856
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
1897
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
1898 def size(self, rev):
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
1899 """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
1900 # 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
1901 # 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
1902 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
1903 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
1904 return self.rawsize(rev)
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
1905
48529
c514936d92b4 revlog: remove deprecated APIs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48283
diff changeset
1906 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
1907
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1908 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
1909 """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
1910
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1911 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
1912 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
1913 `ancestors(r)`, `r` included.
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1914
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1915 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
1916 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
1917 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
1918 """
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1919 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
1920 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
1921 return None
48851
d739cd69bb6a revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents: 48769
diff changeset
1922 if rev == nullrev:
d739cd69bb6a revlog: return 0 for the fast_rank of nullrev
pacien <pacien.trangirard@pacien.net>
parents: 48769
diff changeset
1923 return 0 # convention
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1924 return rank
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
1925
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
1926 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
1927 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
1928 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
1929 return base
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
1930
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
1931 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
1932 iterrev = rev
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
1933 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
1934 while base != iterrev:
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
1935 iterrev = base
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
1936 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
1937
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
1938 self._chainbasecache[rev] = base
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
1939 return base
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1940
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1941 def linkrev(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1942 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
1943
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1944 def parentrevs(self, rev):
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
1945 try:
35521
a0fab647a8f1 revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35345
diff changeset
1946 entry = self.index[rev]
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
1947 except IndexError:
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
1948 if rev == wdirrev:
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
1949 raise error.WdirUnsupported
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
1950 raise
47504
411dc27fd9fd corruption: backout changeset 49fd21f32695 (issue6528)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
1951
51062
14574a41a7a7 revlog: remove legacy usage of `canonical_parent_order`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51061
diff changeset
1952 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
1953 return entry[6], entry[5]
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1954 else:
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1955 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
1956
40152
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1957 # 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
1958 _uncheckedparentrevs = parentrevs
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1959
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1960 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
1961 try:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
1962 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
1963 except IndexError:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
1964 if rev == wdirrev:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
1965 raise error.WdirUnsupported
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
1966 raise
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1967
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1968 # Derived from index values.
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1969
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1970 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
1971 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
1972
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1973 def parents(self, node):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1974 i = self.index
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
1975 d = i[self.rev(node)]
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1976 # 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
1977 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
1978 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
1979 else:
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
1980 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
1981
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1982 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
1983 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
1984
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
1985 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
1986 chaininfocache = self._chaininfocache
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
1987 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
1988 return chaininfocache[rev]
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1989 index = self.index
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
1990 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
1991 iterrev = rev
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1992 e = index[iterrev]
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1993 clen = 0
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
1994 compresseddeltalen = 0
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1995 while iterrev != e[3]:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1996 clen += 1
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
1997 compresseddeltalen += e[1]
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1998 if generaldelta:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
1999 iterrev = e[3]
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2000 else:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2001 iterrev -= 1
23306
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2002 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
2003 t = chaininfocache[iterrev]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2004 clen += t[0]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2005 compresseddeltalen += t[1]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2006 break
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
2007 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
2008 else:
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2009 # 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
2010 # 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
2011 compresseddeltalen += e[1]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2012 r = (clen, compresseddeltalen)
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2013 chaininfocache[rev] = r
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2014 return r
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
2015
27468
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
2016 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
2017 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
2018
18081
f88c60e740a1 revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents: 17975
diff changeset
2019 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
2020 """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
2021 Does not generate revs lower than stoprev.
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2022
18090
9abc55ef85b5 revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents: 18083
diff changeset
2023 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
2024
40152
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2025 # 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
2026 revs = list(revs)
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2027 checkrev = self.node
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2028 for r in revs:
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2029 checkrev(r)
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
2030 # 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
2031
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
2032 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
2033 lazyancestors = rustancestor.LazyAncestors
41115
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2034 arg = self.index
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2035 else:
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2036 lazyancestors = ancestor.lazyancestors
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2037 arg = self._uncheckedparentrevs
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
2038 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
2039
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
2040 def descendants(self, revs):
39999
0b24fcd88066 dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39908
diff changeset
2041 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
2042
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2043 def findcommonmissing(self, common=None, heads=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2044 """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
2045 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
2046 tuple:
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2047
15835
fa15869bf95c revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15827
diff changeset
2048 ::common, (::heads) - (::common)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2049
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2050 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
2051 topologically sorted.
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2052
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2053 '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
2054 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
2055 supplied, uses nullid."""
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2056 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2057 common = [self.nullid]
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2058 if heads is None:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2059 heads = self.heads()
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2060
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2061 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
2062 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
2063
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2064 # 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
2065 class lazyset:
20073
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2066 def __init__(self, lazyvalues):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2067 self.addedvalues = set()
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2068 self.lazyvalues = lazyvalues
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2069
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2070 def __contains__(self, value):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2071 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
2072
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2073 def __iter__(self):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2074 added = self.addedvalues
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2075 for r in added:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2076 yield r
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2077 for r in self.lazyvalues:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2078 if not r in added:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2079 yield r
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2080
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2081 def add(self, value):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2082 self.addedvalues.add(value)
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2083
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2084 def update(self, values):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2085 self.addedvalues.update(values)
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2086
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
2087 has = lazyset(self.ancestors(common))
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
2088 has.add(nullrev)
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
2089 has.update(common)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2090
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2091 # 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
2092 missing = set()
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 24454
diff changeset
2093 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
2094 while visit:
16803
107a3270a24a cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents: 16786
diff changeset
2095 r = visit.popleft()
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2096 if r in missing:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2097 continue
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2098 else:
8453
d1ca637b0773 revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8391
diff changeset
2099 missing.add(r)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2100 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
2101 if p not in has:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2102 visit.append(p)
8453
d1ca637b0773 revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8391
diff changeset
2103 missing = list(missing)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
2104 missing.sort()
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2105 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
2106
23337
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2107 def incrementalmissingrevs(self, common=None):
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2108 """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
2109 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
2110 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
2111 object.
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2112
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2113 '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
2114 nullrev.
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2115 """
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2116 if common is None:
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2117 common = [nullrev]
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
2118
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
2119 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
2120 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
2121 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
2122
17972
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2123 def findmissingrevs(self, common=None, heads=None):
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2124 """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
2125 are not ancestors of common.
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2126
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2127 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
2128 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
2129
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2130 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
2131 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
2132
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2133 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
2134 topologically sorted.
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2135
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2136 '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
2137 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
2138 supplied, uses nullid."""
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2139 if common is None:
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2140 common = [nullrev]
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2141 if heads is None:
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2142 heads = self.headrevs()
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2143
23338
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2144 inc = self.incrementalmissingrevs(common=common)
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2145 return inc.missingancestors(heads)
17972
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
2146
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2147 def findmissing(self, common=None, heads=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2148 """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
2149
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2150 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
2151 satisfies the following constraints:
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2152
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2153 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
2154 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
2155
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2156 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
2157 topologically sorted.
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2158
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
2159 '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
2160 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
2161 supplied, uses nullid."""
17971
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2162 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2163 common = [self.nullid]
17971
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2164 if heads is None:
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2165 heads = self.heads()
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2166
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
2167 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
2168 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
2169
23338
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2170 inc = self.incrementalmissingrevs(common=common)
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
2171 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
2172
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2173 def nodesbetween(self, roots=None, heads=None):
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2174 """Return a topological path from 'roots' to 'heads'.
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2175
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2176 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
2177 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
2178 these constraints:
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2179
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2180 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
2181 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
2182
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2183 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
2184 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
2185 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
2186
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2187 '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
2188 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
2189 '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
2190
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
2191 '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
2192 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
2193 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
2194 nonodes = ([], [], [])
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2195 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
2196 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
2197 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
2198 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2199 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
2200 else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2201 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
2202 lowestrev = nullrev
3b4e00cba57a Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3508
diff changeset
2203 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
2204 # We want _all_ the nodes!
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2205 return (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2206 [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
2207 [self.nullid],
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2208 list(self.heads()),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2209 )
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2210 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
2211 # 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
2212 # node.
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2213 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
2214 # 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
2215 ancestors = None
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2216 # 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
2217 heads = {}
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2218 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
2219 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
2220 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
2221 return nonodes
8464
7af92e70bb25 revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8453
diff changeset
2222 ancestors = set()
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2223 # 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
2224 # 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
2225 # find from roots.
14219
c33427080671 revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents: 14208
diff changeset
2226 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
2227 # 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
2228 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
2229 # 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
2230 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
2231 while nodestotag:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2232 # 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
2233 n = nodestotag.pop()
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2234 # Never tag nullid
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2235 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
2236 continue
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2237 # 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
2238 # 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
2239 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
2240 if r >= lowestrev:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2241 if n not in ancestors:
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2242 # 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
2243 # 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
2244 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
2245 # 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
2246 nodestotag.update(
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2247 [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
2248 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2249 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
2250 # 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
2251 # any other heads.
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2252 heads.pop(n)
1459
106fdec8e1fb Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents: 1458
diff changeset
2253 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
2254 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2255 # 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
2256 # 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
2257
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2258 # 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
2259 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
2260 # 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
2261 # 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
2262
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2263 # 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
2264 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
2265 # 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
2266 if roots:
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2267 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
2268 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2269 # 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
2270 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2271 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2272 # 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
2273 # 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
2274 lowestrev = nullrev
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2275 roots = [self.nullid]
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
2276 # Transform our roots list into a set.
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2277 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
2278 # 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
2279 # '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
2280 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
2281 # 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
2282 orderedout = []
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2283 # 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
2284 # 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
2285 # 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
2286 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
2287 n = self.node(r)
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2288 isdescendant = False
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2289 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
2290 isdescendant = True
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2291 elif n in descendants:
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2292 # n is already a descendant
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2293 isdescendant = True
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2294 # 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
2295 # 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
2296 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
2297 # 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
2298 p = tuple(self.parents(n))
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2299 # 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
2300 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
2301 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
2302 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2303 p = tuple(self.parents(n))
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2304 # 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
2305 # 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
2306 # up there, remember?)
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2307 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
2308 descendants.add(n)
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2309 isdescendant = True
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
2310 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
2311 # 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
2312 orderedout.append(n)
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2313 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
2314 # 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
2315 # from roots.
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2316 # 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
2317 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
2318 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
2319 # 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
2320 # 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
2321 # 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
2322 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
2323 # 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
2324 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
2325 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
2326 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
2327 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
2328 assert orderedout
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2329 assert roots
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2330 assert heads
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
2331 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
2332
41275
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2333 def headrevs(self, revs=None):
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2334 if revs is None:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2335 try:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2336 return self.index.headrevs()
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2337 except AttributeError:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
2338 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
2339 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
2340 return rustdagop.headrevs(self.index, revs)
41763
6843379bf99e changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents: 41689
diff changeset
2341 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
2342
24444
27e3ba73fbb1 phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents: 24255
diff changeset
2343 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
2344 return self.index.computephasesmapsets(roots)
24444
27e3ba73fbb1 phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents: 24255
diff changeset
2345
17674
e69274f8d444 clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17673
diff changeset
2346 def _headrevs(self):
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2347 count = len(self)
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2348 if not count:
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2349 return [nullrev]
17673
d686c6876ef6 clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17672
diff changeset
2350 # 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
2351 ishead = [0] * (count + 1)
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2352 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
2353 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
2354 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
2355 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
2356 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
2357 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
2358
3923
27230c29bfec fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3755
diff changeset
2359 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
2360 """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
2361
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
2362 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
2363 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
2364 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
2365 as if they had no children
1551
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
2366 """
4991
9c8c42bcf17a revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents: 4990
diff changeset
2367 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
2368 if not len(self):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2369 return [self.nullid]
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
2370 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
2371
1551
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
2372 if start is None:
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2373 start = nullrev
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2374 else:
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2375 start = self.rev(start)
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2376
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2377 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
2378
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2379 revs = dagop.headrevssubset(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2380 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2381 )
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2382
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
2383 return [self.node(rev) for rev in revs]
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2384
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2385 def children(self, node):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2386 """find the children of a given node"""
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2387 c = []
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2388 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
2389 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
2390 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
2391 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
2392 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
2393 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
2394 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
2395 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
2396 c.append(self.node(r))
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
2397 return c
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 484
diff changeset
2398
21104
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
2399 def commonancestorsheads(self, a, b):
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
2400 """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
2401 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
2402 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
2403 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
2404
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2405 def _commonancestorsheads(self, *revs):
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2406 """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
2407 try:
38512
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
2408 ancs = self.index.commonancestorsheads(*revs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2409 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
2410 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
2411 return ancs
21104
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
2412
22381
392ae5cb8d62 revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents: 22282
diff changeset
2413 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
2414 """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
2415
160da69ba1bf revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38663
diff changeset
2416 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
2417 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
2418 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
2419
a06b2b032557 revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38665
diff changeset
2420 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
2421 """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
2422
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2423 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
2424
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2425 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
2426 reachableroots is not."""
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2427 if a == nullrev:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2428 return True
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2429 elif a == b:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2430 return True
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2431 elif a > b:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
2432 return False
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2433 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
2434
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2435 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
2436 """return (heads(::(<roots> and <roots>::<heads>)))
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2437
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2438 If includepath is True, return (<roots>::<heads>)."""
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2439 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2440 return self.index.reachableroots2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2441 minroot, heads, roots, includepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2442 )
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
2443 except AttributeError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2444 return dagop._reachablerootspure(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2445 self.parentrevs, minroot, roots, heads, includepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2446 )
22381
392ae5cb8d62 revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents: 22282
diff changeset
2447
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
2448 def ancestor(self, a, b):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22381
diff changeset
2449 """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
2450
10897
adb6a291bbdb revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10404
diff changeset
2451 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
2452 try:
5bae936764bb parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents: 18987
diff changeset
2453 ancs = self.index.ancestors(a, b)
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
2454 except (AttributeError, OverflowError):
18988
5bae936764bb parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents: 18987
diff changeset
2455 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
2456 if ancs:
3605d4e7e618 revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents: 18986
diff changeset
2457 # choose a consistent winner when there's a tie
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
2458 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
2459 return self.nullid
10897
adb6a291bbdb revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10404
diff changeset
2460
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2461 def _match(self, id):
16762
93f8b9565257 revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents: 16686
diff changeset
2462 if isinstance(id, int):
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
2463 # 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
2464 return self.node(id)
47042
c5e1cc0b4c77 core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents: 47041
diff changeset
2465 if len(id) == self.nodeconstants.nodelen:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2466 # possibly a binary node
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2467 # 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
2468 try:
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2469 node = id
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2470 self.rev(node) # quick search the index
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2471 return node
39775
974592474dee revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39774
diff changeset
2472 except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2473 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
2474 try:
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
2475 # str(rev)
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
2476 rev = int(id)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2477 if b"%d" % rev != id:
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2478 raise ValueError
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2479 if rev < 0:
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2480 rev = len(self) + rev
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2481 if rev < 0 or rev >= len(self):
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
2482 raise ValueError
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
2483 return self.node(rev)
469
e205194ca7ef Various node id lookup tweaks
mpm@selenic.com
parents: 451
diff changeset
2484 except (ValueError, OverflowError):
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
2485 pass
47041
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47038
diff changeset
2486 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
2487 try:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2488 # a full hex nodeid?
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
2489 node = bin(id)
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
2490 self.rev(node)
3157
4fe41a9e4591 optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3156
diff changeset
2491 return node
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 49247
diff changeset
2492 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
2493 pass
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2494
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2495 def _partialmatch(self, id):
37449
a0d71618074f revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 37443
diff changeset
2496 # 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
2497 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
2498 ambiguous = False
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
2499 try:
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2500 partial = self.index.partialmatch(id)
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
2501 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
2502 if maybewdir:
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2503 # 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
2504 ambiguous = True
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2505 else:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2506 return partial
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2507 elif maybewdir:
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2508 # 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
2509 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
2510 else:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2511 return None
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2512 except error.RevlogError:
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
2513 # 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
2514 # 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
2515 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
2516 ambiguous = True
19471
fd1bb7c1be78 revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents: 19326
diff changeset
2517 # 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
2518 except (AttributeError, ValueError):
49415
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2519 # 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
2520 pass
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2521 if ambiguous:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2522 raise error.AmbiguousPrefixLookupError(
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
2523 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
2524 )
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
2525
13258
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
2526 if id in self._pcache:
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
2527 return self._pcache[id]
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
2528
37819
ee3d58b4a47f revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
2529 if len(id) <= 40:
49247
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2530 # hex(node)[:...]
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2531 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
2532 try:
49415
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2533 # 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
2534 # 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
2535 if len(id) % 2 > 0:
5fe7e9eda0f3 revlog: make _partialmatch fail fast on almost-hex inputs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49306
diff changeset
2536 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
2537 return None
49246
31602d471b60 revlog: make round-down pattern clearer
Manuel Jacob <me@manueljacob.de>
parents: 49227
diff changeset
2538 prefix = bin(id[:l])
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 49247
diff changeset
2539 except binascii.Error:
49247
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2540 pass
3e5f1fb2aec7 revlog: make try block smaller
Manuel Jacob <me@manueljacob.de>
parents: 49246
diff changeset
2541 else:
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
2542 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
2543 nl = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2544 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
2545 ]
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2546 if self.nodeconstants.nullhex.startswith(id):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2547 nl.append(self.nullid)
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
2548 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
2549 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
2550 self._pcache[id] = nl[0]
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
2551 return nl[0]
39774
4a2466b2a434 revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39773
diff changeset
2552 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
2553 id, self.display_id, _(b'ambiguous identifier')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2554 )
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2555 if maybewdir:
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
2556 raise error.WdirUnsupported
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
2557 return None
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2558
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2559 def lookup(self, id):
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2560 """locate a node based on:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2561 - revision number or str(revision number)
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2562 - 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
2563 """
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2564 n = self._match(id)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2565 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
2566 return n
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2567 n = self._partialmatch(id)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2568 if n:
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
2569 return n
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 484
diff changeset
2570
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
2571 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
2572
37767
44d1959acb3b revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37494
diff changeset
2573 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
2574 """Find the shortest unambiguous prefix that matches node."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2575
37863
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
2576 def isvalid(prefix):
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2577 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
2578 matchednode = self._partialmatch(prefix)
39831
7a9e2d85f475 revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents: 39778
diff changeset
2579 except error.AmbiguousPrefixLookupError:
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2580 return False
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2581 except error.WdirUnsupported:
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2582 # single 'ff...' match
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2583 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
2584 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
2585 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
2586 return True
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2587
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2588 def maybewdir(prefix):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2589 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
2590
37767
44d1959acb3b revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37494
diff changeset
2591 hexnode = hex(node)
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2592
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2593 def disambiguate(hexnode, minlength):
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37970
diff changeset
2594 """Disambiguate against wdirid."""
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
2595 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
2596 prefix = hexnode[:length]
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37970
diff changeset
2597 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
2598 return prefix
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2599
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2600 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
2601 try:
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2602 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
2603 return disambiguate(hexnode, length)
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2604 except error.RevlogError:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2605 if node != self.nodeconstants.wdirid:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2606 raise error.LookupError(
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
2607 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
2608 )
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2609 except AttributeError:
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2610 # 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
2611 pass
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
2612
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2613 if node == self.nodeconstants.wdirid:
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
2614 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
2615 prefix = hexnode[:length]
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2616 if isvalid(prefix):
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2617 return prefix
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
2618
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
2619 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
2620 prefix = hexnode[:length]
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
2621 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
2622 return disambiguate(hexnode, length)
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
2623
2890
5df3e5cf16bc Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
2624 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
2625 """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
2626
a463e3c50212 cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11323
diff changeset
2627 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
2628 """
2890
5df3e5cf16bc Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
2629 p1, p2 = self.parents(node)
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
2630 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
2631
11929
1839a7518b0d revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 11928
diff changeset
2632 def deltaparent(self, rev):
14195
0013d3eeb826 revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents: 14164
diff changeset
2633 """return deltaparent of the given revision"""
14253
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
2634 base = self.index[rev][3]
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
2635 if base == rev:
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2636 return nullrev
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
2637 elif self.delta_config.general_delta:
14253
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
2638 return base
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2639 else:
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2640 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
2641
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
2642 def issnapshot(self, rev):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2643 """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
2644 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
2645 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
2646 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
2647
39152
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
2648 def snapshotdepth(self, rev):
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
2649 """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
2650 if not self.issnapshot(rev):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2651 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
2652 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
2653
1941
7518823709a2 revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1853
diff changeset
2654 def revdiff(self, rev1, rev2):
31753
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2655 """return or calculate a delta between two revisions
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2656
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
2657 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
2658 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
2659 """
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
2660 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
2661 return bytes(self._inner._chunk(rev2))
5005
72082bfced9a revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents: 5004
diff changeset
2662
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2663 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
2664
51019
33d2f0164d0d revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51017
diff changeset
2665 def revision(self, nodeorrev):
16435
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16424
diff changeset
2666 """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
2667 number.
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16424
diff changeset
2668 """
51019
33d2f0164d0d revlog: drop the df argument to `revision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51017
diff changeset
2669 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
2670
51021
299b7b5440db revlog: drop the df argument to `sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51020
diff changeset
2671 def sidedata(self, nodeorrev):
42980
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2672 """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
2673
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2674 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
2675 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
2676 efficient/lazy code.
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2677 """
47382
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2678 # deal with <nodeorrev> argument type
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2679 if isinstance(nodeorrev, int):
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2680 rev = nodeorrev
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2681 else:
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2682 rev = self.rev(nodeorrev)
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
2683 return self._sidedata(rev)
42980
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
2684
51094
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2685 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
2686 """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
2687
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2688 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
2689 """
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2690 # 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
2691 # 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
2692 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
2693 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
2694 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
2695
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2696 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
2697 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
2698
be56d322ee89 revlog: move the `rawtext` method on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51093
diff changeset
2699 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
2700
51023
8520db304f01 revlog: drop more file description passing between private function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51022
diff changeset
2701 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
2702 # deal with <nodeorrev> argument type
16375
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2703 if isinstance(nodeorrev, int):
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2704 rev = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2705 node = self.node(rev)
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2706 else:
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2707 node = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2708 rev = None
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
2709
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
2710 # 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
2711 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
2712 return b""
42789
bf070a59546a revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42788
diff changeset
2713
43979
bdb357161d7a revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents: 43957
diff changeset
2714 # ``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
2715 # 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
2716 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
2717
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2718 if raw and validated:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2719 # 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
2720 # 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
2721 return rawtext
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2722 if rev is None:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2723 rev = self.rev(node)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2724 # 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
2725 # (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
2726 flags = self.flags(rev)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2727
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2728 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
2729 # 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
2730 return rawtext
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2731
42879
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
2732 if raw:
42992
dff95420480f flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42991
diff changeset
2733 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
2734 text = rawtext
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
2735 else:
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2736 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
2737 text, validatehash = r
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2738 if validatehash:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2739 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
2740 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
2741 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
2742
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
2743 return text
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
2744
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2745 def _sidedata(self, rev):
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2746 """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
2747 sidedata_end = None
49d75cc12b8f revlog: move `sidedata` in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51094
diff changeset
2748 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
2749 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
2750 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
2751
51020
14de15825253 revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51019
diff changeset
2752 def rawdata(self, nodeorrev):
14de15825253 revlog: drop the df argument to `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51019
diff changeset
2753 """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
2754 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
2755
22785
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
2756 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
2757 """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
2758
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
2759 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
2760 as needed.
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
2761 """
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
2762 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
2763
30584
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2764 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
2765 """Check node hash integrity.
19624
55749cb14d24 revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents: 19471
diff changeset
2766
30584
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2767 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
2768 behaviors as needed.
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
2769 """
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2770 try:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2771 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
2772 p1, p2 = self.parents(node)
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2773 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
2774 # 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
2775 # 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
2776 # 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
2777 # 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
2778 # 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
2779 # verification state.
51093
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2780 if (
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2781 self._inner._revisioncache
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2782 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
2783 ):
8ec2de9c6770 revlog: move the_revisioncache on the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51092
diff changeset
2784 self._inner._revisioncache = None
40054
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
2785
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2786 revornode = rev
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2787 if revornode is None:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2788 revornode = templatefilters.short(hex(node))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2789 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2790 _(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
2791 % (self.display_id, pycompat.bytestr(revornode))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2792 )
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2793 except error.RevlogError:
51047
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
2794 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
2795 text
0d33f4b0c4cb revlog: remove legacy usage of `_censorable`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51046
diff changeset
2796 ):
47161
f574734eb2b7 revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47160
diff changeset
2797 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
2798 raise
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2799
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
2800 @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
2801 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
2802 """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
2803
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
2804 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
2805 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
2806 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
2807 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
2808 # 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
2809 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
2810 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
2811 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
2812 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
2813 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
2814 else:
12f13b13f414 revlog: avoid possible collision between directory and temporary index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50658
diff changeset
2815 # 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
2816 # 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
2817 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
2818
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
2819 def _enforceinlinesize(self, tr, side_write=True):
26376
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
2820 """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
2821
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
2822 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
2823 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
2824 to use multiple index and data files.
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
2825 """
38844
119d14f41cb2 revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
2826 tiprev = len(self) - 1
47167
88bd08a6830f revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47166
diff changeset
2827 total_size = self.start(tiprev) + self.length(tiprev)
51179
a93e52f0b6ff changelog: disallow delayed write on inline changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51178
diff changeset
2828 if not self._inline or (self._may_inline and total_size < _maxinline):
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2829 return
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
2830
51085
31f143448704 revlog: drop reference to docket in the inline-splitting code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51084
diff changeset
2831 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
2832 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
2833 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
2834
51178
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2835 # In the common case, we enforce inline size because the revlog has
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2836 # been appened too. And in such case, it must have an initial offset
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2837 # recorded in the transaction.
51102
af96fbb8f739 revlog: add a `canonical_index_file` attribute on inner revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51099
diff changeset
2838 troffset = tr.findoffset(self._inner.canonical_index_file)
51178
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2839 pre_touched = troffset is not None
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2840 if not pre_touched and self.target[0] != KIND_CHANGELOG:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2841 raise error.RevlogError(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2842 _(b"%s not found in the transaction") % self._indexfile
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2843 )
51178
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2844
dcaa2df1f688 changelog: never inline changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51163
diff changeset
2845 tr.addbackup(self._inner.canonical_index_file, for_offset=pre_touched)
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
2846 tr.add(self._datafile, 0)
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
2847
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
2848 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
2849 if side_write:
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
2850 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
2851 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
2852 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
2853 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
2854
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
2855 # 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
2856 # finalized
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
2857 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
2858 opener.rename(
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
2859 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
2860 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
2861 checkambig=True,
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
2862 )
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
2863 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
2864 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
2865 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
2866 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
2867
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
2868 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
2869 maybe_self = weak_self()
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
2870 if maybe_self is not None:
f952be90b051 revlog-split: make sure the self._indexfile attribut is reset (issue6811)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
2871 maybe_self._indexfile = old_index_file_path
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
2872 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
2873 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
2874
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49828
diff changeset
2875 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
2876 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
2877 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
2878 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
2879 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
2880 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
2881 tr.addabort(callback_id, abort_callback)
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
2882
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
2883 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
2884 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
2885 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
2886 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
2887 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
2888 )
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
2889
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
2890 self._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
2891 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
2892 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
2893
de6a8cc24de3 revlog: move the splitting-inline-revlog logic inside the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51086
diff changeset
2894 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
2895
39886
debc4ee597e7 revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents: 39881
diff changeset
2896 def _nodeduplicatecallback(self, transaction, node):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2897 """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
2898
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2899 @contextlib.contextmanager
47463
5fa083a5ff04 copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents: 47457
diff changeset
2900 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
2901 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
2902 yield
47463
5fa083a5ff04 copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents: 47457
diff changeset
2903
5fa083a5ff04 copies: Keep changelog sidedata file open during copy tracing
Simon Sapin <simon.sapin@octobus.net>
parents: 47457
diff changeset
2904 @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
2905 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
2906 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
2907 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
2908 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
2909 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
2910 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
2911 yield
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2912 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
2913 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
2914 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
2915 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
2916 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
2917 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
2918 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
2919 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
2920 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
2921 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
2922 ):
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2923 yield
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2924 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
2925 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
2926
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
2927 @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
2928 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
2929 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
2930
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
2931 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
2932 """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
2933
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
2934 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
2935
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
2936 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
2937 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
2938 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
2939
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2940 def addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2941 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2942 text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2943 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2944 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2945 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2946 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2947 cachedelta=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2948 node=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2949 flags=REVIDX_DEFAULT_FLAGS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2950 deltacomputer=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2951 sidedata=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2952 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2953 """add a revision to the log
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2954
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2955 text - the revision data to add
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2956 transaction - the transaction object used for rollback
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2957 link - the linkrev data to add
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2958 p1, p2 - the parent nodeids of the revision
12012
bade7a9c5c07 revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12011
diff changeset
2959 cachedelta - an optional precomputed delta
19625
6a411a06cb1f revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents: 19624
diff changeset
2960 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
2961 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
2962 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
2963 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
2964 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
2965 multiple calls
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2966 """
19326
7014526d67a8 revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents: 19200
diff changeset
2967 if link == nullrev:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2968 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
2969 _(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
2970 )
25459
0bda5bfaf0b1 revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents: 25410
diff changeset
2971
42986
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
2972 if sidedata is None:
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
2973 sidedata = {}
51058
7c2dc75cdc0f revlog: remove legacy usage of `hassidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51057
diff changeset
2974 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
2975 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2976 _(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
2977 )
42986
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
2978
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2979 if flags:
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2980 node = node or self.hash(text, p1, p2)
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2981
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
2982 rawtext, validatehash = flagutil.processflagswrite(self, text, flags)
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2983
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2984 # If the flag processor modifies the revision data, ignore any provided
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2985 # cachedelta.
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2986 if rawtext != text:
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2987 cachedelta = None
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2988
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2989 if len(rawtext) > _maxentrysize:
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2990 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2991 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2992 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
2993 )
47162
dfe8074239de revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47161
diff changeset
2994 % (self.display_id, len(rawtext))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2995 )
25459
0bda5bfaf0b1 revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents: 25410
diff changeset
2996
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2997 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
2998 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
2999 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
3000 return rev
12023
44c22dc193a4 revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12012
diff changeset
3001
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3002 if validatehash:
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
3003 self.checkhash(rawtext, node, p1=p1, p2=p2)
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
3004
46508
f7b61ad3c64a revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents: 46507
diff changeset
3005 return self.addrawrevision(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3006 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3007 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3008 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3009 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3010 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3011 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3012 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3013 cachedelta=cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3014 deltacomputer=deltacomputer,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3015 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3016 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3017
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3018 def addrawrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3019 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3020 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3021 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3022 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3023 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3024 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3025 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3026 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3027 cachedelta=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3028 deltacomputer=None,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3029 sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3030 ):
32244
3de4c61b5087 revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents: 32229
diff changeset
3031 """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
3032 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
3033 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
3034 """
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3035 with self._writing(transaction):
46507
9ee4e988e2be revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents: 46506
diff changeset
3036 return self._addrevision(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3037 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3038 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3039 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3040 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3041 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3042 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3043 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3044 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3045 deltacomputer=deltacomputer,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3046 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3047 )
3390
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
3048
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
3049 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
3050 return self._inner.compress(data)
17128
1028a1c9077a revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents: 17009
diff changeset
3051
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
3052 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
3053 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
3054
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3055 def _addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3056 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3057 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3058 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3059 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3060 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3061 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3062 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3063 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3064 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3065 alwayscache=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3066 deltacomputer=None,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3067 sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3068 ):
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
3069 """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
3070
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
3071 see addrevision for argument descriptions.
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3072
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3073 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
3074
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3075 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
3076 be used.
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3077
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
3078 invariants:
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3079 - 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
3080 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
3081 """
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3082 if node == self.nullid:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3083 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
3084 _(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
3085 )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3086 if (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3087 node == self.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3088 or node in self.nodeconstants.wdirfilenodeids
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
3089 ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3090 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
3091 _(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
3092 )
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
3093 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
3094 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
3095 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
3096
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3097 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
3098
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3099 curr = len(self)
4981
e7131935fbb3 revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents: 4980
diff changeset
3100 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
3101
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
3102 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
3103
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3104 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
3105 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
3106 # 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
3107 if self._inline:
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3108 # 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
3109 # 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
3110 self._concurrencychecker(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3111 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
3112 )
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3113 else:
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
3114 # 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
3115 self._concurrencychecker(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3116 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
3117 )
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
3118 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
3119
12889
5482c6b826f4 revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents: 12888
diff changeset
3120 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
3121
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
3122 # 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
3123 # become comparable to the uncompressed text
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3124 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
3125 # 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
3126 # 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
3127 # logic that might remove metadata size.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3128 textlen = mdiff.patchedsize(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3129 revlog.size(self, cachedelta[0]), cachedelta[1]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3130 )
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
3131 else:
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3132 textlen = len(rawtext)
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
3133
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3134 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
3135 write_debug = None
51051
ab2bc31fa91f revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51048
diff changeset
3136 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
3137 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
3138 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
3139 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
3140 )
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
3141
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
3142 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
3143 # 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
3144 # 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
3145 # revlog's configuration.
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3146 if (
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3147 self.delta_config.general_delta
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3148 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
3149 ):
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
3150 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
3151 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
3152 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
3153 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
3154
47399
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3155 revinfo = revlogutils.revisioninfo(
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3156 node,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3157 p1,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3158 p2,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3159 btext,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3160 textlen,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3161 cachedelta,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3162 flags,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
3163 )
36744
33275ab5e837 revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents: 36743
diff changeset
3164
51017
509f0f7fc89e delta-computer: stop explicitly taking file handle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51015
diff changeset
3165 deltainfo = deltacomputer.finddeltainfo(revinfo)
35634
b43578ec483a revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents: 35521
diff changeset
3166
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
3167 compression_mode = COMP_MODE_INLINE
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
3168 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
3169 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
3170 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
3171 compression_mode, deltainfo = r
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
3172
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
3173 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
3174 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
3175 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
3176 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
3177 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
3178 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
3179 if (
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3180 h != b'u'
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3181 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
3182 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
3183 ):
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3184 assert not h
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3185 if (
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3186 comp_sidedata[0:1]
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3187 == self._docket.default_compression_header
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3188 ):
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3189 sidedata_compression_mode = COMP_MODE_DEFAULT
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3190 serialized_sidedata = comp_sidedata
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3191 else:
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3192 sidedata_compression_mode = COMP_MODE_INLINE
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
3193 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
3194 else:
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3195 serialized_sidedata = b""
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3196 # 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
3197 # 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
3198 # 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
3199 sidedata_offset = 0
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3200
48761
2e949ede7350 rank: naive rank property computation and retrieval
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
3201 rank = RANK_UNKNOWN
51061
81f3877372c3 revlog: remove legacy usage of `_compute_rank`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51058
diff changeset
3202 if self.feature_config.compute_rank:
48765
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3203 if (p1r, p2r) == (nullrev, nullrev):
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3204 rank = 1
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3205 elif p1r != nullrev and p2r == nullrev:
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3206 rank = 1 + self.fast_rank(p1r)
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3207 elif p1r == nullrev and p2r != nullrev:
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3208 rank = 1 + self.fast_rank(p2r)
580660518459 rank: compute property incrementally
pacien <pacien.trangirard@pacien.net>
parents: 48761
diff changeset
3209 else: # merge node
48855
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3210 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
3211 rank = rustdagop.rank(self.index, p1r, p2r)
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3212 else:
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3213 pmin, pmax = sorted((p1r, p2r))
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3214 rank = 1 + self.fast_rank(pmax)
6ea9ead59cf8 revlog: use rust rank computation if available
pacien <pacien.trangirard@pacien.net>
parents: 48851
diff changeset
3215 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
3216
47396
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3217 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
3218 flags=flags,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
3219 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
3220 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
3221 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
3222 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
3223 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
3224 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
3225 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
3226 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
3227 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
3228 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
3229 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
3230 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
3231 rank=rank,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3232 )
46704
913485776542 revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46607
diff changeset
3233
38850
6104b203bec8 index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38849
diff changeset
3234 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
3235 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
3236 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
3237 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
3238 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
3239 entry = header + entry
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3240 self._writeentry(
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3241 transaction,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3242 entry,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3243 deltainfo.data,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3244 link,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3245 offset,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46704
diff changeset
3246 serialized_sidedata,
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3247 sidedata_offset,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3248 )
39333
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
3249
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
3250 rawtext = btext[0]
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
3251
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
3252 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
3253 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
3254
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3255 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
3256 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
3257 self._chainbasecache[curr] = deltainfo.chainbase
46506
07984507d553 revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents: 46469
diff changeset
3258 return curr
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
3259
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
3260 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
3261 """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
3262 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
3263 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
3264 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
3265 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
3266 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
3267
4cd214c9948d revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46709
diff changeset
3268 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
3269 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
3270 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
3271 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
3272 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
3273
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3274 def _writeentry(
51096
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3275 self,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3276 transaction,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3277 entry,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3278 data,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3279 link,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3280 offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3281 sidedata,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3282 sidedata_offset,
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3283 ):
27430
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
3284 # 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
3285 # 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
3286 # 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
3287 # 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
3288 # 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
3289 # 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
3290 # 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
3291 #
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
3292 # 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
3293 # 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
3294 # 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
3295 # 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
3296 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
3297 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
3298 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
3299 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
3300 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
3301
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3302 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
3303 transaction,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3304 entry,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3305 data,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3306 link,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3307 offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3308 sidedata,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3309 sidedata_offset,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3310 index_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3311 data_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3312 sidedata_end,
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3313 )
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3314 self._enforceinlinesize(transaction)
eba138890c64 revlog: move entry writing in the inner object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51095
diff changeset
3315 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
3316 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
3317 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
3318 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
3319
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
3320 nodemaputil.setup_persistent_nodemap(transaction, self)
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3321
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3322 def addgroup(
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3323 self,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3324 deltas,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3325 linkmapper,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3326 transaction,
46373
711ba0f1057e revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents: 46310
diff changeset
3327 alwayscache=False,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3328 addrevisioncb=None,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3329 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
3330 debug_info=None,
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3331 delta_base_reuse_policy=None,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3332 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3333 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3334 add a delta group
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 45
diff changeset
3335
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3336 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
3337 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
3338 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
3339
00e3f909907f revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
3340 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
3341 this revlog and the node that was added.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3342 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
3343
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3344 if self._adding_group:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3345 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
3346
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3347 # 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
3348 # 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
3349 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
3350 if (
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3351 self.delta_config.general_delta
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3352 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
3353 ):
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3354 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
3355 else:
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3356 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
3357
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3358 self._adding_group = True
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3359 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
3360 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
3361 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
3362 write_debug = None
51051
ab2bc31fa91f revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51048
diff changeset
3363 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
3364 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
3365 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
3366 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
3367 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
3368 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
3369 )
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3370 # 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
3371 for data in deltas:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3372 (
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3373 node,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3374 p1,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3375 p2,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3376 linknode,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3377 deltabase,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3378 delta,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3379 flags,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3380 sidedata,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3381 ) = data
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3382 link = linkmapper(linknode)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3383 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
3384
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3385 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
3386 if rev is not None:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3387 # 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
3388 self._nodeduplicatecallback(transaction, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3389 if duplicaterevisioncb:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3390 duplicaterevisioncb(self, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3391 empty = False
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3392 continue
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3393
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3394 for p in (p1, p2):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3395 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
3396 raise error.LookupError(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3397 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
3398 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3399
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3400 if not self.index.has_node(deltabase):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3401 raise error.LookupError(
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3402 deltabase, self.display_id, _(b'unknown delta base')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3403 )
24120
a450e0a2ba0a revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents: 24118
diff changeset
3404
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3405 baserev = self.rev(deltabase)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3406
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3407 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
3408 # 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
3409 # single patch operation
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3410 hlen = struct.calcsize(b">lll")
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3411 oldlen = self.rawsize(baserev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3412 newlen = len(delta) - hlen
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3413 if delta[:hlen] != mdiff.replacediffheader(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3414 oldlen, newlen
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3415 ):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3416 raise error.CensoredBaseError(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3417 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
3418 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3419
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3420 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
3421 flags |= REVIDX_ISCENSORED
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3422
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3423 # 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
3424 # 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
3425 # 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
3426 # 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
3427 # 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
3428 # 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
3429 # by the flagprocessor.
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3430 rev = self._addrevision(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3431 node,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3432 None,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3433 transaction,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3434 link,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3435 p1,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3436 p2,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3437 flags,
49766
152d9c011bcd changegroup: add `delta_base_reuse_policy` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49677
diff changeset
3438 (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
3439 alwayscache=alwayscache,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3440 deltacomputer=deltacomputer,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3441 sidedata=sidedata,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3442 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3443
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3444 if addrevisioncb:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3445 addrevisioncb(self, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
3446 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
3447 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
3448 self._adding_group = False
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
3449 return not empty
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
3450
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
3451 def iscensored(self, rev):
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
3452 """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
3453 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
3454 return False
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
3455
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
3456 return self.flags(rev) & REVIDX_ISCENSORED
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
3457
47166
c9ae2e7fe154 revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47165
diff changeset
3458 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
3459 """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
3460 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
3461 return False
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
3462
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40298
diff changeset
3463 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
3464
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3465 def getstrippoint(self, minlink):
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3466 """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
3467
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3468 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
3469 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
3470 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3471 return storageutil.resolvestripinfo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3472 minlink,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3473 len(self) - 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3474 self.headrevs(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3475 self.linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3476 self.parentrevs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3477 )
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3478
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8017
diff changeset
3479 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
3480 """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
3481
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3482 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
3483 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
3484
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3485 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
3486 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
3487 strip.
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3488
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
3489 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
3490 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
3491 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
3492 """
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3493 if len(self) == 0:
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3494 return
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3495
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3496 rev, _ = self.getstrippoint(minlink)
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
3497 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
3498 return
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3499
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3500 # 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
3501 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
3502 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
3503 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
3504 end = rev * self.index.entry_size
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3505 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
3506 end = data_end + (rev * self.index.entry_size)
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2002
diff changeset
3507
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3508 if self._sidedatafile:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3509 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
3510 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
3511
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3512 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
3513 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
3514 # 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
3515 # 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
3516 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
3517 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
3518 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
3519 self._docket.write(transaction, stripping=True)
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3520
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3521 # 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
3522 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
3523 self._inner.clear_cache()
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3524
4979
06abdaf78788 revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents: 4978
diff changeset
3525 del self.index[rev:-1]
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
3526
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
3527 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
3528 """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
3529
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3530 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
3531 - 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
3532 - 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
3533
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
3534 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
3535 """
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
3536 expected = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3537 if len(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3538 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
3539
1494
249ca10d37f4 Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents: 1493
diff changeset
3540 try:
35972
82afb1a5ed94 revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents: 35971
diff changeset
3541 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
3542 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
3543 actual = f.tell()
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3544 dd = actual - expected
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
3545 except FileNotFoundError:
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3546 dd = 0
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3547
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3548 try:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3549 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
3550 f.seek(0, io.SEEK_END)
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3551 actual = f.tell()
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13284
diff changeset
3552 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
3553 s = self.index.entry_size
9029
0001e49f1c11 compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents: 8658
diff changeset
3554 i = max(0, actual // s)
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3555 di = actual - (i * s)
4982
9672e3c42b0c revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents: 4981
diff changeset
3556 if self._inline:
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3557 databytes = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3558 for r in self:
5312
fb070713ff36 revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents: 5007
diff changeset
3559 databytes += max(0, self.length(r))
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
3560 dd = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
3561 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
3562 except FileNotFoundError:
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3563 di = 0
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3564
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
3565 return (dd, di)
6891
22cb82433842 revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents: 6872
diff changeset
3566
22cb82433842 revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents: 6872
diff changeset
3567 def files(self):
51079
808f1e38cd1d revlog: small doc to the `files` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51078
diff changeset
3568 """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
3569 res = [self._indexfile]
47450
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3570 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
3571 if not self._inline:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3572 res.append(self._datafile)
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3573 else:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
3574 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
3575 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
3576 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
3577 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
3578 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
3579 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
3580 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
3581 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
3582 return res
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3583
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3584 def emitrevisions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3585 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3586 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3587 nodesorder=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3588 revisiondata=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3589 assumehaveparentrevisions=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3590 deltamode=repository.CG_DELTAMODE_STD,
46715
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46712
diff changeset
3591 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
3592 debug_info=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3593 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3594 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
3595 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3596 b'unhandled value for nodesorder: %s' % nodesorder
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3597 )
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
3598
51043
f636103c4d67 revlog: remove legacy usage of `_generaldelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
3599 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
3600 nodesorder = b'storage'
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
3601
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3602 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3603 not self._storedeltachains
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3604 and deltamode != repository.CG_DELTAMODE_PREV
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3605 ):
40427
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
3606 deltamode = repository.CG_DELTAMODE_FULL
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
3607
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3608 return storageutil.emitrevisions(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3609 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3610 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3611 nodesorder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3612 revlogrevisiondelta,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3613 deltaparentfn=self.deltaparent,
51001
39fa0b948f5a revlog: make the `candelta` method private
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51000
diff changeset
3614 candeltafn=self._candelta,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3615 rawsizefn=self.rawsize,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3616 revdifffn=self.revdiff,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3617 flagsfn=self.flags,
40427
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
3618 deltamode=deltamode,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
3619 revisiondata=revisiondata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3620 assumehaveparentrevisions=assumehaveparentrevisions,
46715
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46712
diff changeset
3621 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
3622 debug_info=debug_info,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3623 )
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
3624
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3625 DELTAREUSEALWAYS = b'always'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3626 DELTAREUSESAMEREVS = b'samerevs'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3627 DELTAREUSENEVER = b'never'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3628
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3629 DELTAREUSEFULLADD = b'fulladd'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3630
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3631 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
3632
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3633 def clone(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3634 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3635 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3636 destrevlog,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3637 addrevisioncb=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3638 deltareuse=DELTAREUSESAMEREVS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3639 forcedeltabothparents=None,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3640 sidedata_helpers=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3641 ):
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3642 """Copy this revlog to another, possibly with format changes.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3643
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3644 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
3645 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
3646 differences.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3647
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3648 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
3649 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
3650 following values:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3651
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3652 DELTAREUSEALWAYS
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3653 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
3654 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
3655 fastest mode of operation.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3656 DELTAREUSESAMEREVS
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3657 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
3658 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
3659 and optimization.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3660 DELTAREUSENEVER
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3661 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
3662 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
3663 algorithm changes).
42997
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
3664 DELTAREUSEFULLADD
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
3665 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
3666 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
3667 eg: large file detection and handling.
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3668
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3669 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
3670 significantly affect run time.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3671
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3672 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3673 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
3674 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
3675 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
3676 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
3677 revision.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3678
40837
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
3679 In addition to the delta policy, the ``forcedeltabothparents``
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
3680 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
3681 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
3682
47086
8bd769b5c941 sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47085
diff changeset
3683 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
3684 `sidedata_helpers`.
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3685 """
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3686 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
3687 raise ValueError(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3688 _(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
3689 )
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3690
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3691 if len(destrevlog):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3692 raise ValueError(_(b'destination revlog is not empty'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3693
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3694 if getattr(self, 'filteredrevs', None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3695 raise ValueError(_(b'source revlog has filtered revisions'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3696 if getattr(destrevlog, 'filteredrevs', None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3697 raise ValueError(_(b'destination revlog has filtered revisions'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3698
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
3699 # 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
3700 # 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
3701 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
3702 destrevlog.delta_config = destrevlog.delta_config.copy()
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3703
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3704 try:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3705 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
3706 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
3707 destrevlog.delta_config.lazy_delta = True
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3708 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
3709 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
3710 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
3711 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
3712 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
3713 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
3714
51027
177e7d6bf875 revlog: overwrite revlog config through copy of the config object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51026
diff changeset
3715 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
3716 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
3717 )
51026
498afb627f78 revlog: move configuration attribute into dedicated object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51023
diff changeset
3718 destrevlog.delta_config.delta_both_parents = delta_both_parents
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3719
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
3720 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
3721 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
3722 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
3723 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
3724 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
3725 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
3726 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
3727 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
3728 )
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
3729
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
3730 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
3731 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
3732
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3733 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
3734 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
3735 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
3736 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
3737 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
3738 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
3739 forcedeltabothparents,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3740 sidedata_helpers,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3741 ):
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
3742 """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
3743 write_debug = None
51051
ab2bc31fa91f revlog: remove legacy usage of `_debug_delta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51048
diff changeset
3744 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
3745 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
3746 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
3747 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
3748 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
3749 )
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
3750 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
3751 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
3752 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
3753
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3754 # 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
3755 # account. Use raw entry from index.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3756 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
3757 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
3758 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
3759 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
3760 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
3761
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3762 # (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
3763 # 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
3764 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
3765 rawtext = None
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3766 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
3767 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
3768 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
3769
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3770 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
3771 (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
3772 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
3773 )
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3774 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
3775
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3776 destrevlog.addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3777 text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3778 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3779 linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3780 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3781 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3782 cachedelta=cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3783 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3784 flags=flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3785 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
3786 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3787 )
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
3788 else:
51063
b79c73a7afce revlog: remove legacy usage of `_lazydelta`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51062
diff changeset
3789 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
3790 dp = self.deltaparent(rev)
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3791 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
3792 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
3793
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3794 sidedata = None
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3795 if not cachedelta:
51110
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3796 try:
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3797 rawtext = self._revisiondata(rev)
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3798 except error.CensoredNodeError as censored:
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3799 assert flags & REVIDX_ISCENSORED
2dec23658969 censor: accept censored revision during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51074
diff changeset
3800 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
3801 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
3802 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
3803 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
3804
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3805 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
3806 (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
3807 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
3808 )
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47078
diff changeset
3809 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
3810
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
3811 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
3812 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
3813 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
3814 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
3815 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
3816 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
3817 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
3818 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
3819 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
3820 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
3821 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
3822 )
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
3823
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3824 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
3825 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
3826
40056
324b4b10351e revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40055
diff changeset
3827 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
3828 if self._format_version == REVLOGV0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3829 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
3830 _(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
3831 % self._format_version
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3832 )
47391
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
3833 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
3834 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
3835 else:
47465
bc8536e09a20 revlog: rewrite `censors.py` to `rewrite.py`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47463
diff changeset
3836 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
3837
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3838 def verifyintegrity(self, state):
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3839 """Verifies the integrity of the revlog.
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3840
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3841 Yields ``revlogproblem`` instances describing problems that are
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3842 found.
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3843 """
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3844 dd, di = self.checksize()
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3845 if dd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3846 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
3847 if di:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3848 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
3849
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
3850 version = self._format_version
39845
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
3851
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
3852 # 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
3853 if version != state[b'expectedversion']:
39845
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
3854 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3855 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
3856 % (self.display_id, version, state[b'expectedversion'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3857 )
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3858
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3859 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
3860 state[b'safe_renamed'] = set()
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3861
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3862 for rev in self:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3863 node = self.node(rev)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3864
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3865 # 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
3866 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3867 # common: the most common case
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3868 # rename: with a rename
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3869 # 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
3870 # 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
3871 # ext: content stored externally
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3872 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3873 # 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
3874 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3875 # | common | rename | meta | ext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3876 # -------------------------------------------------------
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3877 # flags() | 0 | 0 | 0 | not 0
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3878 # renamed() | False | True | False | ?
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3879 # 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
3880 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3881 # "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
3882 # 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
3883 # mentioned below is "revision(rev)".
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3884 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3885 # 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
3886 # 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
3887 # 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
3888 # 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
3889 # possibly somewhere else if flags!=0
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3890 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3891 # 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
3892 # "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
3893 # processors (see flagutil.addflagprocessor).
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3894 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3895 # | common | rename | meta | ext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3896 # -------------------------------------------------
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3897 # rawsize() | L1 | L1 | L1 | L1
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3898 # size() | L1 | L2-LM | L1(*) | L1 (?)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3899 # len(rawtext) | L2 | L2 | L2 | L2
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3900 # len(text) | L2 | L2 | L2 | L3
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3901 # 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
3902 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3903 # 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
3904 # (*): 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
3905 # (?): 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
3906 # rename metadata
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3907 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3908 # Checks needed to be done:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3909 # 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
3910 # 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
3911 # 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
3912
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3913 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3914 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
3915 if skipflags:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3916 skipflags &= self.flags(rev)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3917
43957
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
3918 _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
3919
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3920 l1 = self.rawsize(rev)
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
3921 l2 = len(self.rawdata(node))
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3922
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3923 if l1 != l2:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3924 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3925 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
3926 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3927 )
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3928
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3929 except error.CensoredNodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3930 if state[b'erroroncensored']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3931 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3932 error=_(b'censored file data'), node=node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3933 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3934 state[b'skipread'].add(node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3935 except Exception as e:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3936 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3937 error=_(b'unpacking %s: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3938 % (short(node), stringutil.forcebytestr(e)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3939 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3940 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3941 state[b'skipread'].add(node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3942
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3943 def storageinfo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3944 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3945 exclusivefiles=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3946 sharedfiles=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3947 revisionscount=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3948 trackedsize=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3949 storedsize=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3950 ):
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3951 d = {}
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3952
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3953 if exclusivefiles:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3954 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
3955 if not self._inline:
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
3956 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
3957
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3958 if sharedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3959 d[b'sharedfiles'] = []
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3960
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3961 if revisionscount:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3962 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
3963
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3964 if trackedsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3965 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
3966
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3967 if storedsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3968 d[b'storedsize'] = sum(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3969 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
3970 )
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3971
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3972 return d
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3973
47216
2bd4b5218918 revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47215
diff changeset
3974 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
3975 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
3976 return
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
3977 # 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
3978 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
3979 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
3980 # 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
3981 return
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3982
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3983 new_entries = []
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3984 # append the new sidedata
47218
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
3985 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
3986 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
3987 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
3988
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3989 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
3990 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
3991 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
3992 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
3993 store=self,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3994 sidedata_helpers=helpers,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3995 sidedata={},
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3996 rev=rev,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3997 )
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3998
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
3999 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
4000 new_sidedata
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4001 )
47259
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4002
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4003 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
4004 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
4005 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
4006 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
4007 if (
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4008 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
4009 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
4010 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
4011 ):
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4012 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
4013 if (
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4014 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
4015 == 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
4016 ):
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4017 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
4018 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
4019 else:
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
4020 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
4021 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
4022 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
4023 # 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
4024 # 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
4025 # revlog.
47228
e51392acd70c revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47222
diff changeset
4026 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
4027 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
4028
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4029 # 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
4030 # the sidedata helpers
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47077
diff changeset
4031 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
4032 entry_update = (
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4033 current_offset,
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4034 len(serialized_sidedata),
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
4035 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
4036 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
4037 )
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46716
diff changeset
4038
47217
8f6165c90163 revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47216
diff changeset
4039 # 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
4040 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
4041 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
4042 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
4043 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
4044 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
4045
47218
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
4046 # rewrite the new index entries
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
4047 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
4048 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
4049 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
4050 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
4051 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
4052 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
4053 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
4054 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
4055 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
4056 ifh.write(packed)