annotate mercurial/revlog.py @ 47457:f8330a3fc39f

censor: implement censoring for revlogv2 It is a bit verbose and rough, but it works. Most of that logic can be common for `stripping`, so we can expect more refactoring of that code to accommodate both needs. However I wanted to keep this changesets "simple enough" and before moving forward. We also need to properly delete the older index/data/sidedata file, but this has implication for streaming clone and transaction, so this will come later. Differential Revision: https://phab.mercurial-scm.org/D10869
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 07 Jun 2021 11:59:27 +0200
parents f93a867a6486
children 5fa083a5ff04
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 from __future__ import absolute_import
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
16
46852
fbfb1d6d8459 revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46819
diff changeset
17 import binascii
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 24454
diff changeset
18 import collections
35973
4d66993bdcff revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents: 35972
diff changeset
19 import contextlib
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
20 import errno
42567
4eaf7197a740 cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents: 42462
diff changeset
21 import io
27430
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
22 import os
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
23 import struct
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
24 import zlib
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
25
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
26 # 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
27 from .node import (
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
28 bin,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
29 hex,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
30 nullrev,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
31 sha1nodeconstants,
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
32 short,
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
33 wdirrev,
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
34 )
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
35 from .i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
36 from .pycompat import getattr
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
37 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
38 ALL_KINDS,
47266
921648d31553 changelogv2: use a dedicated version number
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47263
diff changeset
39 CHANGELOGV2,
47255
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
40 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
41 COMP_MODE_INLINE,
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
42 COMP_MODE_PLAIN,
47231
4d1c893b9095 revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47230
diff changeset
43 FEATURES_BY_VERSION,
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
44 FLAG_GENERALDELTA,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
45 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
46 INDEX_HEADER,
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
47 KIND_CHANGELOG,
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
48 REVLOGV0,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
49 REVLOGV1,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
50 REVLOGV1_FLAGS,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
51 REVLOGV2,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
52 REVLOGV2_FLAGS,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
53 REVLOG_DEFAULT_FLAGS,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
54 REVLOG_DEFAULT_FORMAT,
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
55 REVLOG_DEFAULT_VERSION,
47230
0e9105bf54cb revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47228
diff changeset
56 SUPPORTED_FLAGS,
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
57 )
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
58 from .revlogutils.flagutil import (
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
59 REVIDX_DEFAULT_FLAGS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
60 REVIDX_ELLIPSIS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
61 REVIDX_EXTSTORED,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
62 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
63 REVIDX_HASCOPIESINFO,
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
64 REVIDX_ISCENSORED,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
65 REVIDX_RAWTEXT_CHANGING_FLAGS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42719
diff changeset
66 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
67 from .thirdparty import attr
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
68 from . import (
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
69 ancestor,
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
70 dagop,
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
71 error,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
72 mdiff,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32315
diff changeset
73 policy,
31574
a8e55d6f1d67 revlog: use pycompat.maplist to eagerly evaluate map on Python 3
Augie Fackler <augie@google.com>
parents: 31504
diff changeset
74 pycompat,
47394
ac60a1366a49 revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47393
diff changeset
75 revlogutils,
27361
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
76 templatefilters,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
77 util,
29f50344fa83 revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27251
diff changeset
78 )
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
79 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
80 repository,
42814
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
81 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
82 )
39330
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
83 from .revlogutils import (
47391
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
84 censor,
39330
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
85 deltas as deltautil,
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
86 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
87 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
88 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
89 randomaccessfile,
47038
724db234b790 revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47037
diff changeset
90 revlogv0,
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
91 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
92 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36760
diff changeset
93 from .utils import (
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
94 storageutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36760
diff changeset
95 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36760
diff changeset
96 )
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
97
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
98 # 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
99 # 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
100
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
101 REVLOGV0
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
102 REVLOGV1
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
103 REVLOGV2
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
104 FLAG_INLINE_DATA
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
105 FLAG_GENERALDELTA
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
106 REVLOG_DEFAULT_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
107 REVLOG_DEFAULT_FORMAT
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
108 REVLOG_DEFAULT_VERSION
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
109 REVLOGV1_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
110 REVLOGV2_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
111 REVIDX_ISCENSORED
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
112 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
113 REVIDX_HASCOPIESINFO
39329
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
114 REVIDX_EXTSTORED
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
115 REVIDX_DEFAULT_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
116 REVIDX_FLAGS_ORDER
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
117 REVIDX_RAWTEXT_CHANGING_FLAGS
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39232
diff changeset
118
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43440
diff changeset
119 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43440
diff changeset
120 rustancestor = policy.importrust('ancestor')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43440
diff changeset
121 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
122 rustrevlog = policy.importrust('revlog')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32315
diff changeset
123
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
124 # Aliased for performance.
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
125 _zlibdecompress = zlib.decompress
5007
3addf4531643 revlog: localize some fastpath functions
Matt Mackall <mpm@selenic.com>
parents: 5006
diff changeset
126
10916
9c84395a338e add documentation for revlog._prereadsize
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10914
diff changeset
127 # max size of revlog with inline data
9c84395a338e add documentation for revlog._prereadsize
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10914
diff changeset
128 _maxinline = 131072
10913
f2ecc5733c89 revlog: factor out _maxinline global.
Greg Ward <greg-hg@gerg.ca>
parents: 10404
diff changeset
129
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
130 # Flag processors for REVIDX_ELLIPSIS.
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
131 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
132 return text, False
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
133
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
134
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
135 def ellipsiswriteprocessor(rl, text):
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
136 return text, False
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
137
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
138
39767
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
139 def ellipsisrawprocessor(rl, text):
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
140 return 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 ellipsisprocessor = (
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
144 ellipsisreadprocessor,
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
145 ellipsiswriteprocessor,
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
146 ellipsisrawprocessor,
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
147 )
db088e133e91 revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39333
diff changeset
148
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
149
43957
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
150 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
151 """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
152 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
153 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
154 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
155 else:
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
156 # 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
157 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
158
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
159
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
160 # 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
161 #
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
162 # 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
163 # 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
164 # wheelbarrow of other slowness source)
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 HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or util.safehasattr(
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 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
167 )
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
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45942
diff changeset
169
39231
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
170 @interfaceutil.implementer(repository.irevisiondelta)
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
171 @attr.s(slots=True)
39231
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
172 class revlogrevisiondelta(object):
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
173 node = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
174 p1node = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
175 p2node = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
176 basenode = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
177 flags = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
178 baserevisionsize = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
179 revision = attr.ib()
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
180 delta = attr.ib()
46712
e8c11a2c96c0 delta: add sidedata field to revision delta
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
181 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
182 protocol_flags = attr.ib()
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
183 linknode = attr.ib(default=None)
39231
b41d023a412a repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39192
diff changeset
184
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
185
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
186 @interfaceutil.implementer(repository.iverifyproblem)
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
187 @attr.s(frozen=True)
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
188 class revlogproblem(object):
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
189 warning = attr.ib(default=None)
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
190 error = attr.ib(default=None)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
191 node = attr.ib(default=None)
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
192
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
193
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
194 def parse_index_v1(data, inline):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
195 # 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
196 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
197 return index, cache
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
198
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
199
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
200 def parse_index_v2(data, inline):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
201 # 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
202 index, cache = parsers.parse_index2(data, inline, revlogv2=True)
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
203 return index, cache
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
204
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
205
47270
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
206 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
207 # call the C implementation to parse the index data
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
208 assert not inline
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
209 from .pure.parsers import parse_index_cl_v2
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
210
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
211 index, cache = parse_index_cl_v2(data)
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
212 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
213
25ce16bf724b changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47269
diff changeset
214
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
215 if util.safehasattr(parsers, 'parse_index_devel_nodemap'):
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
216
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
217 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
218 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
219 return index, cache
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
220
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 else:
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
223 parse_index_v1_nodemap = None
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
224
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 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
227 index, cache = parse_index_v1(data, inline)
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
228 return rustrevlog.MixedIndex(index), cache
4972
8d0cf46e0dc6 revlog: add revlogio interface
Matt Mackall <mpm@selenic.com>
parents: 4971
diff changeset
229
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
230
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
231 # 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
232 # signed integer)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
233 _maxentrysize = 0x7FFFFFFF
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
234
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
235 FILE_TOO_SHORT_MSG = _(
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
236 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
237 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
238 )
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
239
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
240
42995
73288e7abe9b flagprocessors: remove flagprocessorsmixin
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42994
diff changeset
241 class revlog(object):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
242 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
243 the underlying revision storage object
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
244
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
245 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
246
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
247 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
248 information on each revision, including its nodeid (hash), the
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
249 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
250 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
251 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
252 data.
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
253
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
254 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
255 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
256 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
257 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
258 version data. This makes retrieval of a version proportional to
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
259 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
260
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
261 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
262 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
263 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
264 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
265
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
266 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
267 writing, to avoid file stat ambiguity.
34296
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
268
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
269 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
270 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
271 configured threshold.
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
272
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
273 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
274
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42452
diff changeset
275 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
276 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
277
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
278 `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
279 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
280 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
281 raising).
47246
02a4463565ea revlog: improve documentation of the entry tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47245
diff changeset
282
47393
7a0ec25d5836 revlog: move entry documentation alongside new related constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47391
diff changeset
283 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
284 index entry.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
285 """
42994
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
286
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
287 _flagserrorclass = error.RevlogError
3674797ae8b9 flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42993
diff changeset
288
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
289 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
290 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
291 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
292 target,
47150
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
293 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
294 postfix=None, # only exist for `tmpcensored` now
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
295 checkambig=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
296 mmaplargeindex=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
297 censorable=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
298 upperboundcomp=None,
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
299 persistentnodemap=False,
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
300 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
301 trypending=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
302 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
303 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
304 create a revlog object
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
305
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
306 opener is a function that abstracts the file opening operation
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
307 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
308
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
309 `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
310 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
311 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
312 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
313 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
314 accurate value.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
315 """
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
316 self.upperboundcomp = upperboundcomp
47150
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
317
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
318 self.radix = radix
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47149
diff changeset
319
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
320 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
321 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
322 self._datafile = None
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
323 self._sidedatafile = None
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
324 self._nodemap_file = None
47145
c6b8d5d91e73 revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47144
diff changeset
325 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
326 self._trypending = trypending
47151
24be247a13b4 revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47150
diff changeset
327 self.opener = opener
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
328 if persistentnodemap:
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
329 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
330
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
331 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
332 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
333 self.target = target
29997
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
334 # When True, indexfile is opened with checkambig=True at writing, to
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
335 # avoid file stat ambiguity.
b5e5ddf48bd2 revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29830
diff changeset
336 self._checkambig = checkambig
41203
d0de4fdd87aa revlog: store mmaplargeindex as an instance attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41202
diff changeset
337 self._mmaplargeindex = mmaplargeindex
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
338 self._censorable = censorable
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
339 # 3-tuple of (node, rev, text) for a raw revision.
40052
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
340 self._revisioncache = None
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
341 # 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
342 self._chainbasecache = util.lrucachedict(100)
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
343 # 2-tuple of (offset, data) of raw data from the revlog at an offset.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
344 self._chunkcache = (0, b'')
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
345 # How much data to read and cache into the raw revlog data cache.
20180
969148b49fc6 revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents: 20179
diff changeset
346 self._chunkcachesize = 65536
23255
76effa770ff9 revlog: add config variable for limiting delta-chain length
Mateusz Kwapich <mitrandir@fb.com>
parents: 23254
diff changeset
347 self._maxchainlen = None
38736
93777d16a25d aggressivemergedeltas: rename variable internally
Boris Feld <boris.feld@octobus.net>
parents: 38718
diff changeset
348 self._deltabothparents = True
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
349 self.index = None
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
350 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
351 self._nodemap_docket = None
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
352 # 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
353 self._pcache = {}
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
354 # Mapping of revision integer to full node.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
355 self._compengine = b'zlib'
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41872
diff changeset
356 self._compengineopts = {}
33207
895ecec31c70 revlog: add an experimental option to mitigated delta issues (issue5480)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33171
diff changeset
357 self._maxdeltachainspan = -1
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
358 self._withsparseread = False
38717
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38716
diff changeset
359 self._sparserevlog = False
47222
c2180093682a revlog: determine sidedata support based on the revlog version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47219
diff changeset
360 self.hassidedata = False
38632
eb8504715071 sparse-read: target density of 50% instead of 25%
Paul Morelle <paul.morelle@octobus.net>
parents: 38602
diff changeset
361 self._srdensitythreshold = 0.50
34881
8c9b08a0c48c sparse-read: skip gaps too small to be worth splitting
Paul Morelle <paul.morelle@octobus.net>
parents: 34880
diff changeset
362 self._srmingapsize = 262144
4985
e6525e459157 revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents: 4984
diff changeset
363
39768
7b2b42fc377a revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39767
diff changeset
364 # 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
365 # 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
366 self._flagprocessors = dict(flagutil.flagprocessors)
39768
7b2b42fc377a revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39767
diff changeset
367
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
368 # 3-tuple of file handles being used for active writing.
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
369 self._writinghandles = 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
370 # 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
371 self._adding_group = None
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
372
41204
e3cfe0702eac revlog: inline opener options logic into _loadindex()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41203
diff changeset
373 self._loadindex()
e3cfe0702eac revlog: inline opener options logic into _loadindex()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41203
diff changeset
374
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
375 self._concurrencychecker = concurrencychecker
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
376
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
377 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
378 """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
379
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
380 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
381
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
382 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
383
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
384 * newversionflags:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
385 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
386
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
387 * mmapindexthreshold:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
388 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
389
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
390 * force_nodemap:
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
391 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
392 """
34296
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34291
diff changeset
393 mmapindexthreshold = None
43025
3518da504303 vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
394 opts = self.opener.options
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
395
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
396 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
397 new_header = CHANGELOGV2
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47261
diff changeset
398 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
399 new_header = REVLOGV2
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
400 elif b'revlogv1' in opts:
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
401 new_header = REVLOGV1 | FLAG_INLINE_DATA
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
402 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
403 new_header |= FLAG_GENERALDELTA
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
404 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
405 new_header = REVLOGV0
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
406 else:
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
407 new_header = REVLOG_DEFAULT_VERSION
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
408
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
409 if b'chunkcachesize' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
410 self._chunkcachesize = opts[b'chunkcachesize']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
411 if b'maxchainlen' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 self._maxchainlen = opts[b'maxchainlen']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
413 if b'deltabothparents' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
414 self._deltabothparents = opts[b'deltabothparents']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
415 self._lazydelta = bool(opts.get(b'lazydelta', True))
41819
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41764
diff changeset
416 self._lazydeltabase = False
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41764
diff changeset
417 if self._lazydelta:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
418 self._lazydeltabase = bool(opts.get(b'lazydeltabase', False))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
419 if b'compengine' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
420 self._compengine = opts[b'compengine']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
421 if b'zlib.level' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
422 self._compengineopts[b'zlib.level'] = opts[b'zlib.level']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
423 if b'zstd.level' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
424 self._compengineopts[b'zstd.level'] = opts[b'zstd.level']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
425 if b'maxdeltachainspan' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 self._maxdeltachainspan = opts[b'maxdeltachainspan']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
427 if self._mmaplargeindex and b'mmapindexthreshold' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
428 mmapindexthreshold = opts[b'mmapindexthreshold']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
429 self._sparserevlog = bool(opts.get(b'sparse-revlog', False))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
430 withsparseread = bool(opts.get(b'with-sparse-read', False))
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
431 # sparse-revlog forces sparse-read
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
432 self._withsparseread = self._sparserevlog or withsparseread
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
433 if b'sparse-read-density-threshold' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
434 self._srdensitythreshold = opts[b'sparse-read-density-threshold']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
435 if b'sparse-read-min-gap-size' in opts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
436 self._srmingapsize = opts[b'sparse-read-min-gap-size']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
437 if opts.get(b'enableellipsis'):
41200
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
438 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
439
cecf3f8bccd3 revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41115
diff changeset
440 # revlog v0 doesn't have flag processors
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
441 for flag, processor in pycompat.iteritems(
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
442 opts.get(b'flagprocessors', {})
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
443 ):
42731
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
444 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
445
20180
969148b49fc6 revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents: 20179
diff changeset
446 if self._chunkcachesize <= 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
447 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
448 _(b'revlog chunk cache size %r is not greater than 0')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
449 % self._chunkcachesize
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
450 )
20180
969148b49fc6 revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents: 20179
diff changeset
451 elif self._chunkcachesize & (self._chunkcachesize - 1):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
452 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
453 _(b'revlog chunk cache size %r is not a power of 2')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
454 % self._chunkcachesize
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
455 )
47144
b6e1fe7ac24b revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47143
diff changeset
456 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
457 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
458
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
459 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
460 """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
461
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
462 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
463 try:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
464 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
465 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
466 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
467 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
468 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
469 # 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
470 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
471 # 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
472 # 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
473 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
474 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
475 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
476 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
477 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
478 return fp.read()
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
479 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
480 return fp.read(size)
47169
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
481 except IOError as inst:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
482 if inst.errno != errno.ENOENT:
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
483 raise
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
484 return b''
a13f72b9ccfb revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47168
diff changeset
485
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
486 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
487
47171
729668105901 revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47170
diff changeset
488 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
489
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
490 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
491 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
492 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
493 entry_point = 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
494 else:
47175
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
495 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
496
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
497 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
498 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
499 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
500 else:
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
501 entry_data = b''
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
502 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
503 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
504 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
505 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
506 self._initempty = False
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
507 else:
47402
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
508 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
509
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
510 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
511 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
512
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
513 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
514 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
515 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
516 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
517 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
518 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
519 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
520 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
521 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
522 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
523
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
524 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
525 self._inline = features[b'inline'](self._format_flags)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
526 self._generaldelta = features[b'generaldelta'](self._format_flags)
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
527 self.hassidedata = features[b'sidedata']
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
528
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
529 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
530 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
531 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
532 else:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
533 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
534 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
535 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
536 else:
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
537 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
538 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
539 )
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
540
f7f082bc0e7c revlog: allow to pass an existing docket to `_loadindex()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47399
diff changeset
541 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
542 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
543 index_data = b''
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
544 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
545 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
546 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
547 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
548 )
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
549 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
550 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
551 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
552 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
553
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
554 self._inline = False
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
555 # generaldelta implied by version 2 revlogs.
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
556 self._generaldelta = True
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
557 # 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
558 # 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
559 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
560
47324
0a3fa41fa719 revlogv2: use a unique filename for data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47294
diff changeset
561 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
562 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
563 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
564 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
565 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
566 else:
21ef5f75edf0 revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47174
diff changeset
567 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
568
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
569 self.nodeconstants = sha1nodeconstants
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
570 self.nullid = self.nodeconstants.nullid
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46779
diff changeset
571
41447
189e06b2d719 revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents: 41350
diff changeset
572 # sparse-revlog can't be on without general-delta (issue6056)
189e06b2d719 revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents: 41350
diff changeset
573 if not self._generaldelta:
189e06b2d719 revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents: 41350
diff changeset
574 self._sparserevlog = False
4985
e6525e459157 revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents: 4984
diff changeset
575
39232
0a5b20c107a6 repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39231
diff changeset
576 self._storedeltachains = True
30154
5e72129d75ed revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30012
diff changeset
577
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
578 devel_nodemap = (
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
579 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
580 and force_nodemap
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
581 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
582 )
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44310
diff changeset
583
44513
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
584 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
585 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
586 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
587 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
588 else:
e7fff9c3cdac rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44501
diff changeset
589 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
590
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
591 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
592 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
593 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
594 elif self._format_version == REVLOGV2:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
595 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
596 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
597 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
598 elif devel_nodemap:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
599 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
600 elif use_rust_index:
47036
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47034
diff changeset
601 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
602 try:
47176
8b549ea4bebf revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47175
diff changeset
603 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
604 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
605 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
606 not self._inline
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
607 and self._nodemap_file is not None
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
608 and util.safehasattr(index, 'update_nodemap_data')
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
609 )
671f9479af0e nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44313
diff changeset
610 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
611 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
612 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
613 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
614 if (
affe0fb42250 nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44516
diff changeset
615 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
616 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
617 ):
44515
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
618 # no changelog tampering
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
619 self._nodemap_docket = docket
6c906eaedd0d nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44513
diff changeset
620 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
621 except (ValueError, IndexError):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
622 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
623 _(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
624 )
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
625 self.index = index
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
626 self._segmentfile = randomaccessfile.randomaccessfile(
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
627 self.opener,
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
628 (self._indexfile if self._inline else self._datafile),
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
629 self._chunkcachesize,
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
630 chunkcache,
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
631 )
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
632 self._segmentfile_sidedata = randomaccessfile.randomaccessfile(
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
633 self.opener,
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
634 self._sidedatafile,
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
635 self._chunkcachesize,
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
636 )
23306
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
637 # revnum -> (chain-length, sum-delta-length)
45779
8719a5b68419 revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents: 45735
diff changeset
638 self._chaininfocache = util.lrucachedict(500)
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
639 # revlog header -> revlog compressor
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
640 self._decompressors = {}
116
e484cd5ec282 Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents: 115
diff changeset
641
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
642 @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
643 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
644 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
645
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
646 @util.propertycache
47153
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
647 def display_id(self):
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
648 """The public facing "ID" of the revlog that we use in message"""
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
649 # Maybe we should build a user facing representation of
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
650 # revlog.target instead of using `self.radix`
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
651 return self.radix
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
652
47254
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
653 def _get_decompressor(self, t):
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
654 try:
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
655 compressor = self._decompressors[t]
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
656 except KeyError:
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
657 try:
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
658 engine = util.compengines.forrevlogheader(t)
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
659 compressor = engine.revlogcompressor(self._compengineopts)
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
660 self._decompressors[t] = compressor
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
661 except KeyError:
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
662 raise error.RevlogError(
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
663 _(b'unknown compression type %s') % binascii.hexlify(t)
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
664 )
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
665 return compressor
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
666
47153
fbf38517d17d revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47151
diff changeset
667 @util.propertycache
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
668 def _compressor(self):
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41872
diff changeset
669 engine = util.compengines[self._compengine]
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41872
diff changeset
670 return engine.revlogcompressor(self._compengineopts)
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
671
47255
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
672 @util.propertycache
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
673 def _decompressor(self):
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
674 """the default decompressor"""
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
675 if self._docket is None:
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
676 return None
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
677 t = self._docket.default_compression_header
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
678 c = self._get_decompressor(t)
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
679 return c.decompress
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
680
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
681 def _indexfp(self):
35968
91b3b11565e5 revlog: move index file opening in a method
Boris Feld <boris.feld@octobus.net>
parents: 35967
diff changeset
682 """file object for the revlog's index file"""
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
683 return self.opener(self._indexfile, mode=b"r")
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
684
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
685 def __index_write_fp(self):
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
686 # You should not use this directly and use `_writing` instead
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
687 try:
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
688 f = self.opener(
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
689 self._indexfile, mode=b"r+", checkambig=self._checkambig
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
690 )
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
691 if self._docket is None:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
692 f.seek(0, os.SEEK_END)
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
693 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
694 f.seek(self._docket.index_end, os.SEEK_SET)
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
695 return f
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
696 except IOError as inst:
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
697 if inst.errno != errno.ENOENT:
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
698 raise
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
699 return self.opener(
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
700 self._indexfile, mode=b"w+", checkambig=self._checkambig
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
701 )
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
702
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
703 def __index_new_fp(self):
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
704 # You should not use this unless you are upgrading from inline revlog
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
705 return self.opener(
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
706 self._indexfile,
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
707 mode=b"w",
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
708 checkambig=self._checkambig,
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
709 atomictemp=True,
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
710 )
35968
91b3b11565e5 revlog: move index file opening in a method
Boris Feld <boris.feld@octobus.net>
parents: 35967
diff changeset
711
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
712 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
713 """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
714 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
715
35973
4d66993bdcff revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents: 35972
diff changeset
716 @contextlib.contextmanager
47387
75e1104f23a2 revlog: use dedicated code for reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47386
diff changeset
717 def _sidedatareadfp(self):
75e1104f23a2 revlog: use dedicated code for reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47386
diff changeset
718 """file object suitable to read sidedata"""
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
719 if self._writinghandles:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
720 yield self._writinghandles[2]
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
721 else:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
722 with self.opener(self._sidedatafile) as fp:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
723 yield fp
47387
75e1104f23a2 revlog: use dedicated code for reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47386
diff changeset
724
43440
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
725 def tiprev(self):
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
726 return len(self.index) - 1
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
727
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
728 def tip(self):
43440
ec7ba79bf3db revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43133
diff changeset
729 return self.node(self.tiprev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
730
24030
828dc8db5515 revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents: 23857
diff changeset
731 def __contains__(self, rev):
828dc8db5515 revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents: 23857
diff changeset
732 return 0 <= rev < len(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
733
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
734 def __len__(self):
38851
781b2720d2ac index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38850
diff changeset
735 return len(self.index)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
736
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
737 def __iter__(self):
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38777
diff changeset
738 return iter(pycompat.xrange(len(self)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
739
17672
474047947b8f clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17537
diff changeset
740 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
741 """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
742 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
743
43574
02802fa87b74 revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43573
diff changeset
744 @property
13275
68da048b4c88 revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents: 13268
diff changeset
745 def nodemap(self):
43574
02802fa87b74 revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43573
diff changeset
746 msg = (
43619
c207c46a86b9 py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43581
diff changeset
747 b"revlog.nodemap is deprecated, "
c207c46a86b9 py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43581
diff changeset
748 b"use revlog.index.[has_node|rev|get_rev]"
43574
02802fa87b74 revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43573
diff changeset
749 )
02802fa87b74 revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43573
diff changeset
750 util.nouideprecwarn(msg, b'5.3', stacklevel=2)
43528
90a0f631829e revlog: return the nodemap as the nodecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43526
diff changeset
751 return self.index.nodemap
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
752
43530
6e3e3e5446ba revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43529
diff changeset
753 @property
6e3e3e5446ba revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43529
diff changeset
754 def _nodecache(self):
43619
c207c46a86b9 py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43581
diff changeset
755 msg = b"revlog._nodecache is deprecated, use revlog.index.nodemap"
43530
6e3e3e5446ba revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43529
diff changeset
756 util.nouideprecwarn(msg, b'5.3', stacklevel=2)
6e3e3e5446ba revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43529
diff changeset
757 return self.index.nodemap
6e3e3e5446ba revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43529
diff changeset
758
16374
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
759 def hasnode(self, node):
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
760 try:
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
761 self.rev(node)
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
762 return True
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
763 except KeyError:
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
764 return False
29c2ff719715 revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents: 15890
diff changeset
765
36743
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
766 def candelta(self, baserev, rev):
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
767 """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
768 # 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
769 # 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
770 # 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
771 # 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
772 # rawtext contents) and the delta could be incompatible.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
773 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
774 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
775 ):
36743
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
776 return False
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
777 return True
d031609b3cb7 changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents: 35738
diff changeset
778
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
779 def update_caches(self, transaction):
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
780 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
781 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
782 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
783 else:
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
784 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
785
16414
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16375
diff changeset
786 def clearcaches(self):
40052
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
787 self._revisioncache = None
29830
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
788 self._chainbasecache.clear()
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
789 self._segmentfile.clear_cache()
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
790 self._segmentfile_sidedata.clear_cache()
27465
072a675c51f2 revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27449
diff changeset
791 self._pcache = {}
44501
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
792 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
793 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
794 # 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
795 # 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
796 use_nodemap = (
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
797 not self._inline
47164
04f2f94836a5 revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
798 and self._nodemap_file is not None
44501
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
799 and util.safehasattr(self.index, 'update_nodemap_data')
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
800 )
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
801 if use_nodemap:
87b327de772c nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44491
diff changeset
802 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
803 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
804 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
805 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
806
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
807 def rev(self, node):
13275
68da048b4c88 revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents: 13268
diff changeset
808 try:
43553
2da51e292734 index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43552
diff changeset
809 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
810 except TypeError:
4092d12ba18a repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents: 21752
diff changeset
811 raise
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
812 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
813 # 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
814 if (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
815 node == self.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
816 or node in self.nodeconstants.wdirfilenodeids
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
817 ):
43525
845e5b313783 revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43524
diff changeset
818 raise error.WdirUnsupported
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
819 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
820
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
821 # Accessors for index entries.
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
822
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
823 # 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
824 # are flags.
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2002
diff changeset
825 def start(self, rev):
5006
c2febf5420e9 revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents: 5005
diff changeset
826 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
827
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
828 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
829 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
830 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
831 return sd_cut_off
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
832 # 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
833 # 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
834 # previous-size)
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
835 #
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
836 # 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
837 # 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
838 while 0 <= rev:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
839 e = self.index[rev]
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
840 if e[9] != 0:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
841 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
842 rev -= 1
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
843 return 0
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
844
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
845 def flags(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
846 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
847
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
848 def length(self, rev):
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
849 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
850
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
851 def sidedata_length(self, rev):
47136
84b176ad2860 revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47134
diff changeset
852 if not self.hassidedata:
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
853 return 0
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
854 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
855
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
856 def rawsize(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
857 """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
858 l = self.index[rev][2]
38177
7fa3408f83ef revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents: 38169
diff changeset
859 if l >= 0:
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
860 return l
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
861
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
862 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
863 return len(t)
31856
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
864
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
865 def size(self, rev):
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
866 """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
867 # 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
868 # 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
869 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
870 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
871 return self.rawsize(rev)
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
872
0ab7f469d386 revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents: 31804
diff changeset
873 return len(self.revision(rev, raw=False))
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
874
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
875 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
876 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
877 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
878 return base
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
879
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
880 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
881 iterrev = rev
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
882 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
883 while base != iterrev:
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
884 iterrev = base
fc72beec2a1a revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents: 38168
diff changeset
885 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
886
92ac2baaea86 revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29829
diff changeset
887 self._chainbasecache[rev] = base
14252
19067884c5f5 revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents: 14251
diff changeset
888 return base
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
889
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
890 def linkrev(self, rev):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
891 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
892
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
893 def parentrevs(self, rev):
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
894 try:
35521
a0fab647a8f1 revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35345
diff changeset
895 entry = self.index[rev]
32403
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
896 except IndexError:
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
897 if rev == wdirrev:
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
898 raise error.WdirUnsupported
a28c76e1cea9 revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32393
diff changeset
899 raise
46779
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
900 if entry[5] == nullrev:
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
901 return entry[6], entry[5]
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
902 else:
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
903 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
904
40152
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
905 # 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
906 _uncheckedparentrevs = parentrevs
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
907
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
908 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
909 try:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
910 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
911 except IndexError:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
912 if rev == wdirrev:
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
913 raise error.WdirUnsupported
34e9b8b94f66 revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32403
diff changeset
914 raise
30287
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
915
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
916 # Derived from index values.
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
917
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
918 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
919 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
920
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
921 def parents(self, node):
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
922 i = self.index
0986f225c149 revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30210
diff changeset
923 d = i[self.rev(node)]
46779
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
924 # inline node() to avoid function call overhead
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
925 if d[5] == self.nullid:
46779
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
926 return i[d[6]][7], i[d[5]][7]
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
927 else:
49fd21f32695 revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents: 46718
diff changeset
928 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
929
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
930 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
931 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
932
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
933 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
934 chaininfocache = self._chaininfocache
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
935 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
936 return chaininfocache[rev]
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
937 index = self.index
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
938 generaldelta = self._generaldelta
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
939 iterrev = rev
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
940 e = index[iterrev]
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
941 clen = 0
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
942 compresseddeltalen = 0
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
943 while iterrev != e[3]:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
944 clen += 1
23286
40e0067899d4 revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents: 23285
diff changeset
945 compresseddeltalen += e[1]
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
946 if generaldelta:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
947 iterrev = e[3]
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
948 else:
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
949 iterrev -= 1
23306
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
950 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
951 t = chaininfocache[iterrev]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
952 clen += t[0]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
953 compresseddeltalen += t[1]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
954 break
23254
d23834b871ac debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents: 22934
diff changeset
955 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
956 else:
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
957 # 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
958 # 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
959 compresseddeltalen += e[1]
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
960 r = (clen, compresseddeltalen)
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
961 chaininfocache[rev] = r
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
962 return r
f7a42f8e82bd revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents: 23288
diff changeset
963
27468
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
964 def _deltachain(self, rev, stoprev=None):
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
965 """Obtain the delta chain for a revision.
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
966
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
967 ``stoprev`` specifies a revision to stop at. If not specified, we
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
968 stop at the base of the chain.
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
969
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
970 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
971 revs in ascending order and ``stopped`` is a bool indicating whether
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
972 ``stoprev`` was hit.
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
973 """
33171
6d678ab1b10d revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32969
diff changeset
974 # Try C implementation.
6d678ab1b10d revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32969
diff changeset
975 try:
6d678ab1b10d revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32969
diff changeset
976 return self.index.deltachain(rev, stoprev, self._generaldelta)
6d678ab1b10d revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32969
diff changeset
977 except AttributeError:
6d678ab1b10d revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32969
diff changeset
978 pass
6d678ab1b10d revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32969
diff changeset
979
27468
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
980 chain = []
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
981
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
982 # Alias to prevent attribute lookup in tight loop.
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
983 index = self.index
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
984 generaldelta = self._generaldelta
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
985
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
986 iterrev = rev
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
987 e = index[iterrev]
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
988 while iterrev != e[3] and iterrev != stoprev:
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
989 chain.append(iterrev)
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
990 if generaldelta:
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
991 iterrev = e[3]
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
992 else:
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
993 iterrev -= 1
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
994 e = index[iterrev]
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
995
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
996 if iterrev == stoprev:
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
997 stopped = True
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
998 else:
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
999 chain.append(iterrev)
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
1000 stopped = False
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
1001
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
1002 chain.reverse()
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
1003 return chain, stopped
93ac15f03331 revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27465
diff changeset
1004
18081
f88c60e740a1 revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents: 17975
diff changeset
1005 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
1006 """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
1007 Does not generate revs lower than stoprev.
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1008
18090
9abc55ef85b5 revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents: 18083
diff changeset
1009 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
1010
40152
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1011 # 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
1012 revs = list(revs)
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1013 checkrev = self.node
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1014 for r in revs:
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1015 checkrev(r)
adbf8ca239e4 revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents: 40056
diff changeset
1016 # 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
1017
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
1018 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
1019 lazyancestors = rustancestor.LazyAncestors
41115
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
1020 arg = self.index
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
1021 else:
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
1022 lazyancestors = ancestor.lazyancestors
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
1023 arg = self._uncheckedparentrevs
536c83535cbd rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents: 41086
diff changeset
1024 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
1025
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
1026 def descendants(self, revs):
39999
0b24fcd88066 dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39908
diff changeset
1027 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
1028
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1029 def findcommonmissing(self, common=None, heads=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1030 """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
1031 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
1032 tuple:
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1033
15835
fa15869bf95c revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15827
diff changeset
1034 ::common, (::heads) - (::common)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1035
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1036 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
1037 topologically sorted.
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1038
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1039 '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
1040 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
1041 supplied, uses nullid."""
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1042 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1043 common = [self.nullid]
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1044 if heads is None:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1045 heads = self.heads()
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1046
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1047 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
1048 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
1049
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1050 # we want the ancestors, but inclusive
20073
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1051 class lazyset(object):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1052 def __init__(self, lazyvalues):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1053 self.addedvalues = set()
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1054 self.lazyvalues = lazyvalues
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1055
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1056 def __contains__(self, value):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1057 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
1058
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1059 def __iter__(self):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1060 added = self.addedvalues
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1061 for r in added:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1062 yield r
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1063 for r in self.lazyvalues:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1064 if not r in added:
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1065 yield r
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1066
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1067 def add(self, value):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1068 self.addedvalues.add(value)
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1069
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1070 def update(self, values):
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1071 self.addedvalues.update(values)
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1072
eeba4eaf0716 revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents: 19776
diff changeset
1073 has = lazyset(self.ancestors(common))
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
1074 has.add(nullrev)
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
1075 has.update(common)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1076
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1077 # 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
1078 missing = set()
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 24454
diff changeset
1079 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
1080 while visit:
16803
107a3270a24a cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents: 16786
diff changeset
1081 r = visit.popleft()
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1082 if r in missing:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1083 continue
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1084 else:
8453
d1ca637b0773 revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8391
diff changeset
1085 missing.add(r)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1086 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
1087 if p not in has:
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1088 visit.append(p)
8453
d1ca637b0773 revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8391
diff changeset
1089 missing = list(missing)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7109
diff changeset
1090 missing.sort()
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
1091 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
1092
23337
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1093 def incrementalmissingrevs(self, common=None):
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1094 """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
1095 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
1096 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
1097 object.
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1098
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1099 '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
1100 nullrev.
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1101 """
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1102 if common is None:
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1103 common = [nullrev]
3a8a763f4197 revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents: 23328
diff changeset
1104
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
1105 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
1106 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
1107 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
1108
17972
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1109 def findmissingrevs(self, common=None, heads=None):
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1110 """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
1111 are not ancestors of common.
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1112
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1113 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
1114 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
1115
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1116 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
1117 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
1118
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1119 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
1120 topologically sorted.
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1121
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1122 '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
1123 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
1124 supplied, uses nullid."""
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1125 if common is None:
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1126 common = [nullrev]
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1127 if heads is None:
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1128 heads = self.headrevs()
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1129
23338
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
1130 inc = self.incrementalmissingrevs(common=common)
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
1131 return inc.missingancestors(heads)
17972
7ef00d09ef35 revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents: 17971
diff changeset
1132
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1133 def findmissing(self, common=None, heads=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1134 """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
1135
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1136 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
1137 satisfies the following constraints:
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1138
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1139 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
1140 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
1141
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1142 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
1143 topologically sorted.
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1144
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13400
diff changeset
1145 '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
1146 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
1147 supplied, uses nullid."""
17971
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
1148 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1149 common = [self.nullid]
17971
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
1150 if heads is None:
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
1151 heads = self.heads()
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
1152
e1b9a78a7aed revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents: 17951
diff changeset
1153 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
1154 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
1155
23338
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
1156 inc = self.incrementalmissingrevs(common=common)
d8f5b2f50f41 revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents: 23337
diff changeset
1157 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
1158
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1159 def nodesbetween(self, roots=None, heads=None):
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1160 """Return a topological path from 'roots' to 'heads'.
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1161
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1162 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
1163 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
1164 these constraints:
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1165
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1166 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
1167 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
1168
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1169 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
1170 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
1171 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
1172
10047
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1173 '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
1174 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
1175 '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
1176
27267b1f68b4 revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents: 9679
diff changeset
1177 '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
1178 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
1179 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
1180 nonodes = ([], [], [])
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1181 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
1182 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
1183 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
1184 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1185 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
1186 else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1187 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
1188 lowestrev = nullrev
3b4e00cba57a Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3508
diff changeset
1189 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
1190 # We want _all_ the nodes!
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1191 return (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1192 [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
1193 [self.nullid],
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1194 list(self.heads()),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1195 )
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1196 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
1197 # 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
1198 # node.
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1199 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
1200 # 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
1201 ancestors = None
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1202 # 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
1203 heads = {}
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1204 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
1205 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
1206 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
1207 return nonodes
8464
7af92e70bb25 revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8453
diff changeset
1208 ancestors = set()
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1209 # 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
1210 # 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
1211 # find from roots.
14219
c33427080671 revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents: 14208
diff changeset
1212 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
1213 # 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
1214 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
1215 # 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
1216 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
1217 while nodestotag:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1218 # 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
1219 n = nodestotag.pop()
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1220 # Never tag nullid
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1221 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
1222 continue
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1223 # 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
1224 # 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
1225 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
1226 if r >= lowestrev:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1227 if n not in ancestors:
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1228 # 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
1229 # 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
1230 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
1231 # 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
1232 nodestotag.update(
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1233 [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
1234 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1235 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
1236 # 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
1237 # any other heads.
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1238 heads.pop(n)
1459
106fdec8e1fb Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents: 1458
diff changeset
1239 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
1240 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1241 # 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
1242 # 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
1243
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1244 # 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
1245 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
1246 # 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
1247 # 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
1248
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1249 # 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
1250 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
1251 # 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
1252 if roots:
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
1253 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
1254 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1255 # 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
1256 return nonodes
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1257 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1258 # 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
1259 # 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
1260 lowestrev = nullrev
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1261 roots = [self.nullid]
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
1262 # Transform our roots list into a set.
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1263 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
1264 # 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
1265 # '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
1266 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
1267 # 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
1268 orderedout = []
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1269 # 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
1270 # 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
1271 # 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
1272 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
1273 n = self.node(r)
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1274 isdescendant = False
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1275 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
1276 isdescendant = True
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1277 elif n in descendants:
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1278 # n is already a descendant
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1279 isdescendant = True
1457
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1280 # 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
1281 # 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
1282 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
1283 # 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
1284 p = tuple(self.parents(n))
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1285 # 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
1286 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
1287 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
1288 else:
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1289 p = tuple(self.parents(n))
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1290 # 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
1291 # 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
1292 # up there, remember?)
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1293 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
1294 descendants.add(n)
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1295 isdescendant = True
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14523
diff changeset
1296 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
1297 # 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
1298 orderedout.append(n)
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1299 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
1300 # 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
1301 # from roots.
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1302 # 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
1303 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
1304 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
1305 # 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
1306 # 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
1307 # 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
1308 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
1309 # 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
1310 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
1311 heads.pop(p, None)
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
1312 heads = [head for head, flag in pycompat.iteritems(heads) if flag]
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
1313 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
1314 assert orderedout
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1315 assert roots
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1316 assert heads
518da3c3b6ce This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents: 1351
diff changeset
1317 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
1318
41275
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
1319 def headrevs(self, revs=None):
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
1320 if revs is None:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
1321 try:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
1322 return self.index.headrevs()
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
1323 except AttributeError:
1421d0487a61 revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents: 41247
diff changeset
1324 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
1325 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
1326 return rustdagop.headrevs(self.index, revs)
41763
6843379bf99e changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents: 41689
diff changeset
1327 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
1328
24444
27e3ba73fbb1 phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents: 24255
diff changeset
1329 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
1330 return self.index.computephasesmapsets(roots)
24444
27e3ba73fbb1 phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents: 24255
diff changeset
1331
17674
e69274f8d444 clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17673
diff changeset
1332 def _headrevs(self):
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
1333 count = len(self)
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
1334 if not count:
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
1335 return [nullrev]
17673
d686c6876ef6 clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17672
diff changeset
1336 # 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
1337 ishead = [0] * (count + 1)
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
1338 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
1339 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
1340 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
1341 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
1342 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
1343 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
1344
3923
27230c29bfec fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3755
diff changeset
1345 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
1346 """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
1347
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
1348 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
1349 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
1350 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
1351 as if they had no children
1551
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
1352 """
4991
9c8c42bcf17a revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents: 4990
diff changeset
1353 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
1354 if not len(self):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1355 return [self.nullid]
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14144
diff changeset
1356 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
1357
1551
e793cbc8be00 Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1550
diff changeset
1358 if start is None:
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
1359 start = nullrev
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
1360 else:
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
1361 start = self.rev(start)
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
1362
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
1363 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
1364
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1365 revs = dagop.headrevssubset(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1366 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1367 )
40000
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
1368
8af835af0a85 dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39999
diff changeset
1369 return [self.node(rev) for rev in revs]
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
1370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
1371 def children(self, node):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
1372 """find the children of a given node"""
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
1373 c = []
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
1374 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
1375 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
1376 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
1377 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
1378 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
1379 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
1380 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
1381 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
1382 c.append(self.node(r))
370
c90385d82aec revlog: add a children function
mpm@selenic.com
parents: 330
diff changeset
1383 return c
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 484
diff changeset
1384
21104
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
1385 def commonancestorsheads(self, a, b):
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
1386 """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
1387 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
1388 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
1389 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
1390
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
1391 def _commonancestorsheads(self, *revs):
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
1392 """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
1393 try:
38512
99f864b34451 revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents: 38511
diff changeset
1394 ancs = self.index.commonancestorsheads(*revs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1395 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
1396 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
1397 return ancs
21104
40ace21cb3a1 revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents: 20965
diff changeset
1398
22381
392ae5cb8d62 revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents: 22282
diff changeset
1399 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
1400 """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
1401
160da69ba1bf revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38663
diff changeset
1402 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
1403 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
1404 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
1405
a06b2b032557 revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38665
diff changeset
1406 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
1407 """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
1408
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1409 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
1410
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1411 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
1412 reachableroots is not."""
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1413 if a == nullrev:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1414 return True
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1415 elif a == b:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1416 return True
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1417 elif a > b:
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38666
diff changeset
1418 return False
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
1419 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
1420
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
1421 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
1422 """return (heads(::(<roots> and <roots>::<heads>)))
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
1423
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
1424 If includepath is True, return (<roots>::<heads>)."""
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
1425 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1426 return self.index.reachableroots2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1427 minroot, heads, roots, includepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1428 )
42446
055c3e2c44f0 revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42044
diff changeset
1429 except AttributeError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1430 return dagop._reachablerootspure(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1431 self.parentrevs, minroot, roots, heads, includepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1432 )
22381
392ae5cb8d62 revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents: 22282
diff changeset
1433
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
1434 def ancestor(self, a, b):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22381
diff changeset
1435 """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
1436
10897
adb6a291bbdb revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10404
diff changeset
1437 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
1438 try:
5bae936764bb parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents: 18987
diff changeset
1439 ancs = self.index.ancestors(a, b)
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
1440 except (AttributeError, OverflowError):
18988
5bae936764bb parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents: 18987
diff changeset
1441 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
1442 if ancs:
3605d4e7e618 revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents: 18986
diff changeset
1443 # choose a consistent winner when there's a tie
21107
4a6c8b6b10d3 revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21104
diff changeset
1444 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
1445 return self.nullid
10897
adb6a291bbdb revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10404
diff changeset
1446
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1447 def _match(self, id):
16762
93f8b9565257 revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents: 16686
diff changeset
1448 if isinstance(id, int):
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
1449 # 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
1450 return self.node(id)
47042
c5e1cc0b4c77 core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents: 47041
diff changeset
1451 if len(id) == self.nodeconstants.nodelen:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1452 # possibly a binary node
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1453 # 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
1454 try:
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1455 node = id
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1456 self.rev(node) # quick search the index
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1457 return node
39775
974592474dee revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39774
diff changeset
1458 except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1459 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
1460 try:
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
1461 # str(rev)
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
1462 rev = int(id)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1463 if b"%d" % rev != id:
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1464 raise ValueError
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1465 if rev < 0:
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1466 rev = len(self) + rev
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
1467 if rev < 0 or rev >= len(self):
4980
fc44c8df9d99 revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents: 4979
diff changeset
1468 raise ValueError
36
da28286bf6b7 Add smart node lookup by substring or by rev number
mpm@selenic.com
parents: 26
diff changeset
1469 return self.node(rev)
469
e205194ca7ef Various node id lookup tweaks
mpm@selenic.com
parents: 451
diff changeset
1470 except (ValueError, OverflowError):
3156
d01e4cb2f5f2 cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3139
diff changeset
1471 pass
47041
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47038
diff changeset
1472 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
1473 try:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1474 # a full hex nodeid?
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1475 node = bin(id)
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
1476 self.rev(node)
3157
4fe41a9e4591 optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3156
diff changeset
1477 return node
39775
974592474dee revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39774
diff changeset
1478 except (TypeError, error.LookupError):
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1479 pass
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1480
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1481 def _partialmatch(self, id):
37449
a0d71618074f revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 37443
diff changeset
1482 # 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
1483 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
1484 ambiguous = False
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
1485 try:
30391
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
1486 partial = self.index.partialmatch(id)
2ded17b64f09 revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents: 30289
diff changeset
1487 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
1488 if maybewdir:
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
1489 # 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
1490 ambiguous = True
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1491 else:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1492 return partial
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1493 elif maybewdir:
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
1494 # 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
1495 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
1496 else:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1497 return None
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
1498 except error.RevlogError:
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
1499 # 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
1500 # 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
1501 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
1502 ambiguous = True
19471
fd1bb7c1be78 revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents: 19326
diff changeset
1503 # 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
1504 except (AttributeError, ValueError):
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
1505 # we are pure python, or key was too short to search radix tree
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
1506 pass
47294
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1507 if ambiguous:
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1508 raise error.AmbiguousPrefixLookupError(
93a0abe098e7 revlog: avoid raising no-arg RevlogError for internal flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 47285
diff changeset
1509 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
1510 )
16665
e410be860393 revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents: 16533
diff changeset
1511
13258
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
1512 if id in self._pcache:
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
1513 return self._pcache[id]
c2661863f16f revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
1514
37819
ee3d58b4a47f revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
1515 if len(id) <= 40:
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1516 try:
3438
b17f9d3eda74 revlog.lookup tweaks
Matt Mackall <mpm@selenic.com>
parents: 3390
diff changeset
1517 # hex(node)[:...]
9029
0001e49f1c11 compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents: 8658
diff changeset
1518 l = len(id) // 2 # grab an even number of digits
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1519 prefix = bin(id[: l * 2])
13259
3b616dfa4b17 revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents: 13258
diff changeset
1520 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
1521 nl = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1522 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
1523 ]
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1524 if self.nodeconstants.nullhex.startswith(id):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1525 nl.append(self.nullid)
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
1526 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
1527 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
1528 self._pcache[id] = nl[0]
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
1529 return nl[0]
39774
4a2466b2a434 revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39773
diff changeset
1530 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
1531 id, self.display_id, _(b'ambiguous identifier')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1532 )
32684
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
1533 if maybewdir:
af854b1b36f8 revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents: 32659
diff changeset
1534 raise error.WdirUnsupported
7365
ec3aafa84d44 lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents: 7363
diff changeset
1535 return None
36238
f574cc00831a node: make bin() be a wrapper instead of just an alias
Augie Fackler <augie@google.com>
parents: 35974
diff changeset
1536 except TypeError:
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1537 pass
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1538
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1539 def lookup(self, id):
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1540 """locate a node based on:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
1541 - revision number or str(revision number)
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
1542 - 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
1543 """
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1544 n = self._match(id)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1545 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
1546 return n
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1547 n = self._partialmatch(id)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1548 if n:
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3438
diff changeset
1549 return n
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 484
diff changeset
1550
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
1551 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
1552
37767
44d1959acb3b revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37494
diff changeset
1553 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
1554 """Find the shortest unambiguous prefix that matches node."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1555
37863
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
1556 def isvalid(prefix):
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1557 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
1558 matchednode = self._partialmatch(prefix)
39831
7a9e2d85f475 revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents: 39778
diff changeset
1559 except error.AmbiguousPrefixLookupError:
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1560 return False
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1561 except error.WdirUnsupported:
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1562 # single 'ff...' match
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1563 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
1564 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
1565 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
1566 return True
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1567
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1568 def maybewdir(prefix):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1569 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
1570
37767
44d1959acb3b revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37494
diff changeset
1571 hexnode = hex(node)
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1572
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1573 def disambiguate(hexnode, minlength):
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37970
diff changeset
1574 """Disambiguate against wdirid."""
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
1575 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
1576 prefix = hexnode[:length]
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37970
diff changeset
1577 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
1578 return prefix
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1579
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1580 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
1581 try:
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1582 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
1583 return disambiguate(hexnode, length)
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
1584 except error.RevlogError:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1585 if node != self.nodeconstants.wdirid:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
1586 raise error.LookupError(
47155
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47153
diff changeset
1587 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
1588 )
37968
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1589 except AttributeError:
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1590 # 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
1591 pass
0304f22497fa revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
1592
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
1593 if node == self.nodeconstants.wdirid:
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
1594 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
1595 prefix = hexnode[:length]
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
1596 if isvalid(prefix):
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
1597 return prefix
0db7fe7c34d3 shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents: 37968
diff changeset
1598
45053
cc2572923ea3 revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents: 44954
diff changeset
1599 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
1600 prefix = hexnode[:length]
6921d3ecadc1 shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37862
diff changeset
1601 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
1602 return disambiguate(hexnode, length)
34250
448725a2ef73 templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34148
diff changeset
1603
2890
5df3e5cf16bc Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
1604 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
1605 """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
1606
a463e3c50212 cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11323
diff changeset
1607 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
1608 """
2890
5df3e5cf16bc Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
1609 p1, p2 = self.parents(node)
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
1610 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
1611
32229
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32227
diff changeset
1612 def _getsegmentforrevs(self, startrev, endrev, df=None):
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1613 """Obtain a segment of raw data corresponding to a range of revisions.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1614
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1615 Accepts the start and end revisions and an optional already-open
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1616 file handle to be used for reading. If the file handle is read, its
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1617 seek position will not be preserved.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1618
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1619 Requests for data may be satisfied by a cache.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1620
27649
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1621 Returns a 2-tuple of (offset, data) for the requested range of
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1622 revisions. Offset is the integer offset from the beginning of the
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1623 revlog and data is a str or buffer of the raw byte data.
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1624
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1625 Callers will need to call ``self.start(rev)`` and ``self.length(rev)``
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1626 to determine where each revision's data begins and ends.
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1627 """
30288
ceddc3d94d74 revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30287
diff changeset
1628 # Inlined self.start(startrev) & self.end(endrev) for perf reasons
ceddc3d94d74 revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30287
diff changeset
1629 # (functions are expensive).
ceddc3d94d74 revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30287
diff changeset
1630 index = self.index
ceddc3d94d74 revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30287
diff changeset
1631 istart = index[startrev]
ceddc3d94d74 revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30287
diff changeset
1632 start = int(istart[0] >> 16)
30289
1f92056c4066 revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30288
diff changeset
1633 if startrev == endrev:
1f92056c4066 revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30288
diff changeset
1634 end = start + istart[1]
1f92056c4066 revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30288
diff changeset
1635 else:
1f92056c4066 revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30288
diff changeset
1636 iend = index[endrev]
1f92056c4066 revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30288
diff changeset
1637 end = int(iend[0] >> 16) + iend[1]
30288
ceddc3d94d74 revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30287
diff changeset
1638
8318
6b8513f8274a revlog: add cache priming for reconstructing delta chains
Matt Mackall <mpm@selenic.com>
parents: 8317
diff changeset
1639 if self._inline:
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
1640 start += (startrev + 1) * self.index.entry_size
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
1641 end += (endrev + 1) * self.index.entry_size
19714
0e07c0b5fb1c revlog.revision: fix cache preload for inline revlogs
Siddharth Agarwal <sid0@fb.com>
parents: 19713
diff changeset
1642 length = end - start
27649
6446e9b37c8b revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
1643
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
1644 return start, self._segmentfile.read_chunk(start, length, df)
8318
6b8513f8274a revlog: add cache priming for reconstructing delta chains
Matt Mackall <mpm@selenic.com>
parents: 8317
diff changeset
1645
26377
dfef0d3be65e revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26376
diff changeset
1646 def _chunk(self, rev, df=None):
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1647 """Obtain a single decompressed chunk for a revision.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1648
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1649 Accepts an integer revision and an optional already-open file handle
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1650 to be used for reading. If used, the seek position of the file will not
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1651 be preserved.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1652
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1653 Returns a str holding uncompressed data for the requested revision.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1654 """
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1655 compression_mode = self.index[rev][10]
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1656 data = self._getsegmentforrevs(rev, rev, df=df)[1]
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1657 if compression_mode == COMP_MODE_PLAIN:
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1658 return data
47255
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
1659 elif compression_mode == COMP_MODE_DEFAULT:
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
1660 return self._decompressor(data)
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1661 elif compression_mode == COMP_MODE_INLINE:
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1662 return self.decompress(data)
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1663 else:
47414
5fbac82a8780 revlog: byteify a few error strings
Matt Harbison <matt_harbison@yahoo.com>
parents: 47413
diff changeset
1664 msg = b'unknown compression mode %d'
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1665 msg %= compression_mode
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1666 raise error.RevlogError(msg)
8650
ef393d6ec030 revlog: refactor chunk cache interface again
Matt Mackall <mpm@selenic.com>
parents: 8643
diff changeset
1667
38644
43d0619cec90 revlog: enforce chunk slicing down to a certain size
Boris Feld <boris.feld@octobus.net>
parents: 38643
diff changeset
1668 def _chunks(self, revs, df=None, targetsize=None):
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1669 """Obtain decompressed chunks for the specified revisions.
19713
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1670
27070
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1671 Accepts an iterable of numeric revisions that are assumed to be in
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1672 ascending order. Also accepts an optional already-open file handle
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1673 to be used for reading. If used, the seek position of the file will
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1674 not be preserved.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1675
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1676 This function is similar to calling ``self._chunk()`` multiple times,
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1677 but is faster.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1678
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1679 Returns a list with decompressed data for each requested revision.
7860366b46c9 revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26907
diff changeset
1680 """
19716
e17976978ee4 revlog: move chunk cache preload from revision to _chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19715
diff changeset
1681 if not revs:
e17976978ee4 revlog: move chunk cache preload from revision to _chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19715
diff changeset
1682 return []
19713
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1683 start = self.start
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1684 length = self.length
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1685 inline = self._inline
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
1686 iosize = self.index.entry_size
19715
1aab406be57c revlog._chunks: inline getchunk
Siddharth Agarwal <sid0@fb.com>
parents: 19714
diff changeset
1687 buffer = util.buffer
19713
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1688
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1689 l = []
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1690 ladd = l.append
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1691
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1692 if not self._withsparseread:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1693 slicedchunks = (revs,)
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1694 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1695 slicedchunks = deltautil.slicechunk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1696 self, revs, targetsize=targetsize
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1697 )
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1698
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1699 for revschunk in slicedchunks:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1700 firstrev = revschunk[0]
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1701 # Skip trailing revisions with empty diff
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1702 for lastrev in revschunk[::-1]:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1703 if length(lastrev) != 0:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1704 break
34823
7891d243d821 revlog: ignore empty trailing chunks when reading segments
Paul Morelle <paul.morelle@octobus.net>
parents: 34296
diff changeset
1705
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1706 try:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1707 offset, data = self._getsegmentforrevs(firstrev, lastrev, df=df)
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1708 except OverflowError:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1709 # issue4215 - we can't cache a run of chunks greater than
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1710 # 2G on Windows
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1711 return [self._chunk(rev, df=df) for rev in revschunk]
19715
1aab406be57c revlog._chunks: inline getchunk
Siddharth Agarwal <sid0@fb.com>
parents: 19714
diff changeset
1712
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1713 decomp = self.decompress
47255
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
1714 # self._decompressor might be None, but will not be used in that case
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
1715 def_decomp = self._decompressor
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1716 for rev in revschunk:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1717 chunkstart = start(rev)
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1718 if inline:
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1719 chunkstart += (rev + 1) * iosize
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34823
diff changeset
1720 chunklength = length(rev)
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1721 comp_mode = self.index[rev][10]
47252
e340b556a13e revlog: use an intermediate variable for `data` in `_chunk`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47249
diff changeset
1722 c = buffer(data, chunkstart - offset, chunklength)
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1723 if comp_mode == COMP_MODE_PLAIN:
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1724 ladd(c)
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1725 elif comp_mode == COMP_MODE_INLINE:
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1726 ladd(decomp(c))
47255
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
1727 elif comp_mode == COMP_MODE_DEFAULT:
ff9fd7107d11 revlog: implement a "default compression" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47254
diff changeset
1728 ladd(def_decomp(c))
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1729 else:
47414
5fbac82a8780 revlog: byteify a few error strings
Matt Harbison <matt_harbison@yahoo.com>
parents: 47413
diff changeset
1730 msg = b'unknown compression mode %d'
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1731 msg %= comp_mode
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
1732 raise error.RevlogError(msg)
19713
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1733
c2e27e57d250 revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents: 19625
diff changeset
1734 return l
14075
bc101902a68d revlog: introduce _chunkbase to allow filelog to override
Sune Foldager <cryo@cyanite.org>
parents: 14064
diff changeset
1735
11929
1839a7518b0d revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 11928
diff changeset
1736 def deltaparent(self, rev):
14195
0013d3eeb826 revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents: 14164
diff changeset
1737 """return deltaparent of the given revision"""
14253
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
1738 base = self.index[rev][3]
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
1739 if base == rev:
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
1740 return nullrev
14253
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
1741 elif self._generaldelta:
c28d5200374c revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14252
diff changeset
1742 return base
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
1743 else:
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
1744 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
1745
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
1746 def issnapshot(self, rev):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
1747 """tells whether rev is a snapshot"""
41086
a28833d79aca revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41084
diff changeset
1748 if not self._sparserevlog:
a28833d79aca revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41084
diff changeset
1749 return self.deltaparent(rev) == nullrev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1750 elif util.safehasattr(self.index, b'issnapshot'):
41086
a28833d79aca revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41084
diff changeset
1751 # directly assign the method to cache the testing and access
a28833d79aca revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41084
diff changeset
1752 self.issnapshot = self.index.issnapshot
a28833d79aca revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41084
diff changeset
1753 return self.issnapshot(rev)
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
1754 if rev == nullrev:
f8db458651c8 revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents: 39147
diff changeset
1755 return True
41084
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1756 entry = self.index[rev]
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1757 base = entry[3]
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1758 if base == rev:
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
1759 return True
41084
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1760 if base == nullrev:
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1761 return True
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1762 p1 = entry[5]
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1763 p2 = entry[6]
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1764 if base == p1 or base == p2:
39150
f39efa885a6d revlog: also detect intermediate snapshots
Paul Morelle <paul.morelle@octobus.net>
parents: 39149
diff changeset
1765 return False
41084
84491ae0b3f0 revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents: 41083
diff changeset
1766 return self.issnapshot(base)
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
1767
39152
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
1768 def snapshotdepth(self, rev):
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
1769 """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
1770 if not self.issnapshot(rev):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1771 raise error.ProgrammingError(b'revision %d not a snapshot')
39152
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
1772 return len(self._deltachain(rev)[0]) - 1
3b1042cab4b4 revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents: 39150
diff changeset
1773
1941
7518823709a2 revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1853
diff changeset
1774 def revdiff(self, rev1, rev2):
31753
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
1775 """return or calculate a delta between two revisions
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
1776
5d11b5edcb0b revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents: 31752
diff changeset
1777 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
1778 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
1779 """
14208
d62d597b8974 revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents: 14196
diff changeset
1780 if rev1 != nullrev and self.deltaparent(rev2) == rev1:
31369
b6f5af372c0c revlog: use bytes() instead of str() to get data from memoryview
Augie Fackler <augie@google.com>
parents: 31357
diff changeset
1781 return bytes(self._chunk(rev2))
5005
72082bfced9a revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents: 5004
diff changeset
1782
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1783 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
1784
42993
01304095256c flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42992
diff changeset
1785 def _processflags(self, text, flags, operation, raw=False):
01304095256c flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42992
diff changeset
1786 """deprecated entry point to access flag processors"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1787 msg = b'_processflag(...) use the specialized variant'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1788 util.nouideprecwarn(msg, b'5.2', stacklevel=2)
42993
01304095256c flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42992
diff changeset
1789 if raw:
01304095256c flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42992
diff changeset
1790 return text, flagutil.processflagsraw(self, text, flags)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1791 elif operation == b'read':
42993
01304095256c flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42992
diff changeset
1792 return flagutil.processflagsread(self, text, flags)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1793 else: # write operation
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1794 return flagutil.processflagswrite(self, text, flags)
42993
01304095256c flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42992
diff changeset
1795
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30584
diff changeset
1796 def revision(self, nodeorrev, _df=None, raw=False):
16435
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16424
diff changeset
1797 """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
1798 number.
26377
dfef0d3be65e revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26376
diff changeset
1799
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30584
diff changeset
1800 _df - an existing file handle to read from. (internal-only)
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30584
diff changeset
1801 raw - an optional argument specifying if the revision data is to be
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30584
diff changeset
1802 treated as raw data when applying flag transforms. 'raw' should be set
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30584
diff changeset
1803 to True when generating changegroups or in debug commands.
16435
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16424
diff changeset
1804 """
42845
f75f47b3ea41 revlog: deprecate the use of `revision(..., raw=True)`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42814
diff changeset
1805 if raw:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1806 msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1807 b'revlog.revision(..., raw=True) is deprecated, '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1808 b'use revlog.rawdata(...)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1809 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1810 util.nouideprecwarn(msg, b'5.2', stacklevel=2)
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
1811 return self._revisiondata(nodeorrev, _df, raw=raw)
42718
389233789952 revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42688
diff changeset
1812
42980
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
1813 def sidedata(self, nodeorrev, _df=None):
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
1814 """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
1815
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
1816 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
1817 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
1818 efficient/lazy code.
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
1819 """
47382
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
1820 # deal with <nodeorrev> argument type
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
1821 if isinstance(nodeorrev, int):
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
1822 rev = nodeorrev
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
1823 else:
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
1824 rev = self.rev(nodeorrev)
d6a52783d2ba revlog: implement sidedata without using _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47328
diff changeset
1825 return self._sidedata(rev)
42980
0d1272783f24 revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42879
diff changeset
1826
42718
389233789952 revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42688
diff changeset
1827 def _revisiondata(self, nodeorrev, _df=None, raw=False):
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
1828 # deal with <nodeorrev> argument type
16375
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1829 if isinstance(nodeorrev, int):
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1830 rev = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1831 node = self.node(rev)
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1832 else:
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1833 node = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1834 rev = None
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16374
diff changeset
1835
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
1836 # 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
1837 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
1838 return b""
42789
bf070a59546a revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42788
diff changeset
1839
43979
bdb357161d7a revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents: 43957
diff changeset
1840 # ``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
1841 # revision or might need to be processed to retrieve the revision.
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1842 rev, rawtext, validated = self._rawtext(node, rev, _df=_df)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1843
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1844 if raw and validated:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1845 # 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
1846 # 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
1847 return rawtext
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1848 if rev is None:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1849 rev = self.rev(node)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1850 # 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
1851 # (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
1852 flags = self.flags(rev)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1853
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1854 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
1855 # 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
1856 return rawtext
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1857
42879
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
1858 if raw:
42992
dff95420480f flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42991
diff changeset
1859 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
1860 text = rawtext
4a3efe0febb5 revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42876
diff changeset
1861 else:
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1862 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
1863 text, validatehash = r
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1864 if validatehash:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1865 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
1866 if not validated:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1867 self._revisioncache = (node, rev, rawtext)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1868
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
1869 return text
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1870
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1871 def _rawtext(self, node, rev, _df=None):
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1872 """return the possibly unvalidated rawtext for a revision
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1873
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1874 returns (rev, rawtext, validated)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1875 """
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1876
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1877 # revision in the cache (could be useful to apply delta)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1878 cachedrev = None
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
1879 # An intermediate text to apply deltas to
42788
2eec53a99ec1 revlog: stop calling `basetext` `rawtext` in _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42787
diff changeset
1880 basetext = None
42790
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
1881
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
1882 # Check if we have the entry in cache
616aa62e5027 revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42789
diff changeset
1883 # The cache entry looks like (node, rev, rawtext)
40052
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
1884 if self._revisioncache:
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
1885 if self._revisioncache[0] == node:
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1886 return (rev, self._revisioncache[2], True)
40052
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
1887 cachedrev = self._revisioncache[1]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1888
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1889 if rev is None:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1890 rev = self.rev(node)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1891
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1892 chain, stopped = self._deltachain(rev, stoprev=cachedrev)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1893 if stopped:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1894 basetext = self._revisioncache[2]
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1895
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1896 # drop cache to save memory, the caller is expected to
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1897 # update self._revisioncache after validating the text
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1898 self._revisioncache = None
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1899
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1900 targetsize = None
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1901 rawsize = self.index[rev][2]
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1902 if 0 <= rawsize:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1903 targetsize = 4 * rawsize
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1904
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1905 bins = self._chunks(chain, df=_df, targetsize=targetsize)
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1906 if basetext is None:
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1907 basetext = bytes(bins[0])
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1908 bins = bins[1:]
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1909
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1910 rawtext = mdiff.patches(basetext, bins)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1911 del basetext # let us have a chance to free memory early
42792
e91411fcc697 revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42791
diff changeset
1912 return (rev, rawtext, False)
13239
12ed25f39d0b revlog: break hash checking into subfunction
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
1913
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1914 def _sidedata(self, rev):
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1915 """Return the sidedata for a given revision number."""
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1916 index_entry = self.index[rev]
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1917 sidedata_offset = index_entry[8]
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1918 sidedata_size = index_entry[9]
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1919
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1920 if self._inline:
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
1921 sidedata_offset += self.index.entry_size * (1 + rev)
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1922 if sidedata_size == 0:
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1923 return {}
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1924
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1925 if self._docket.sidedata_end < sidedata_offset + sidedata_size:
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1926 filename = self._sidedatafile
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1927 end = self._docket.sidedata_end
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1928 offset = sidedata_offset
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1929 length = sidedata_size
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1930 m = FILE_TOO_SHORT_MSG % (filename, length, offset, end)
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1931 raise error.RevlogError(m)
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1932
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1933 comp_segment = self._segmentfile_sidedata.read_chunk(
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1934 sidedata_offset, sidedata_size
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
1935 )
47387
75e1104f23a2 revlog: use dedicated code for reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47386
diff changeset
1936
47257
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1937 comp = self.index[rev][11]
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1938 if comp == COMP_MODE_PLAIN:
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1939 segment = comp_segment
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1940 elif comp == COMP_MODE_DEFAULT:
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1941 segment = self._decompressor(comp_segment)
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1942 elif comp == COMP_MODE_INLINE:
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1943 segment = self.decompress(comp_segment)
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1944 else:
47414
5fbac82a8780 revlog: byteify a few error strings
Matt Harbison <matt_harbison@yahoo.com>
parents: 47413
diff changeset
1945 msg = b'unknown compression mode %d'
47257
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1946 msg %= comp
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1947 raise error.RevlogError(msg)
87d057137f82 revlog: apply compression mode while reading sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47256
diff changeset
1948
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1949 sidedata = sidedatautil.deserialize_sidedata(segment)
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1950 return sidedata
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
1951
42786
ef177c04ac7f revlog: drop silly `raw` parameter to `rawdata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42768
diff changeset
1952 def rawdata(self, nodeorrev, _df=None):
42719
415e4136d326 rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42718
diff changeset
1953 """return an uncompressed raw data of a given node or revision number.
415e4136d326 rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42718
diff changeset
1954
415e4136d326 rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42718
diff changeset
1955 _df - an existing file handle to read from. (internal-only)
415e4136d326 rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42718
diff changeset
1956 """
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
1957 return self._revisiondata(nodeorrev, _df, raw=True)
42719
415e4136d326 rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42718
diff changeset
1958
22785
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
1959 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
1960 """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
1961
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
1962 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
1963 as needed.
abc44fcc9c57 revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents: 22784
diff changeset
1964 """
39877
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39872
diff changeset
1965 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
1966
30584
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
1967 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
1968 """Check node hash integrity.
19624
55749cb14d24 revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents: 19471
diff changeset
1969
30584
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
1970 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
1971 behaviors as needed.
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30543
diff changeset
1972 """
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1973 try:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1974 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
1975 p1, p2 = self.parents(node)
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1976 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
1977 # 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
1978 # 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
1979 # 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
1980 # 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
1981 # 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
1982 # verification state.
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
1983 if self._revisioncache and self._revisioncache[0] == node:
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
1984 self._revisioncache = None
801ccd8e67c0 revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40052
diff changeset
1985
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1986 revornode = rev
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1987 if revornode is None:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
1988 revornode = templatefilters.short(hex(node))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1989 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1990 _(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
1991 % (self.display_id, pycompat.bytestr(revornode))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
1992 )
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
1993 except error.RevlogError:
39879
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39878
diff changeset
1994 if self._censorable and storageutil.iscensoredtext(text):
47161
f574734eb2b7 revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47160
diff changeset
1995 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
1996 raise
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1997
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
1998 def _enforceinlinesize(self, tr):
26376
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
1999 """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
2000
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
2001 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
2002 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
2003 to use multiple index and data files.
344a1621674b revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26243
diff changeset
2004 """
38844
119d14f41cb2 revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
2005 tiprev = len(self) - 1
47167
88bd08a6830f revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47166
diff changeset
2006 total_size = self.start(tiprev) + self.length(tiprev)
88bd08a6830f revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47166
diff changeset
2007 if not self._inline or total_size < _maxinline:
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2008 return
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
2009
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2010 troffset = tr.findoffset(self._indexfile)
45870
a6f08085edfe transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents: 45869
diff changeset
2011 if troffset is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2012 raise error.RevlogError(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2013 _(b"%s not found in the transaction") % self._indexfile
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2014 )
45869
63edc384d3b7 transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents: 45864
diff changeset
2015 trindex = 0
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
2016 tr.add(self._datafile, 0)
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
2017
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2018 existing_handles = False
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2019 if self._writinghandles is not None:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2020 existing_handles = True
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2021 fp = self._writinghandles[0]
8317
5cdf4067857a revlog: use chunk cache to avoid rereading when splitting inline files
Matt Mackall <mpm@selenic.com>
parents: 8316
diff changeset
2022 fp.flush()
5cdf4067857a revlog: use chunk cache to avoid rereading when splitting inline files
Matt Mackall <mpm@selenic.com>
parents: 8316
diff changeset
2023 fp.close()
40627
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
2024 # We can't use the cached file handle after close(). So prevent
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
2025 # its usage.
e9293c5f8bb9 revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40626
diff changeset
2026 self._writinghandles = None
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2027 self._segmentfile.writing_handle = None
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2028 # No need to deal with sidedata writing handle as it is only
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2029 # relevant with revlog-v2 which is never inline, not reaching
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2030 # this code
8315
c8493310ad9b revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents: 8314
diff changeset
2031
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2032 new_dfh = self._datafp(b'w+')
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2033 new_dfh.truncate(0) # drop any potentially existing data
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2034 try:
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
2035 with self._indexfp() as read_ifh:
47213
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2036 for r in 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
2037 new_dfh.write(self._getsegmentforrevs(r, r, df=read_ifh)[1])
47284
21ed126bab53 revlog: fix index computation during inline->non-inline transition
Joerg Sonnenberger <joerg@bec.de>
parents: 47270
diff changeset
2038 if troffset <= self.start(r) + r * self.index.entry_size:
47213
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2039 trindex = r
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2040 new_dfh.flush()
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2041
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
2042 with self.__index_new_fp() as fp:
47213
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2043 self._format_flags &= ~FLAG_INLINE_DATA
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2044 self._inline = False
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2045 for i in self:
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2046 e = self.index.entry_binary(i)
47235
6b1eae313b2f revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47234
diff changeset
2047 if i == 0 and self._docket is None:
47213
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2048 header = self._format_flags | self._format_version
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2049 header = self.index.pack_header(header)
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2050 e = header + e
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2051 fp.write(e)
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2052 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
2053 self._docket.index_end = fp.tell()
47285
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2054
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2055 # There is a small transactional race here. If the rename of
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2056 # the index fails, we should remove the datafile. It is more
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2057 # important to ensure that the data file is not truncated
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2058 # when the index is replaced as otherwise data is lost.
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2059 tr.replace(self._datafile, self.start(trindex))
46b828b85eb7 revlog: update data file record before index rename
Joerg Sonnenberger <joerg@bec.de>
parents: 47284
diff changeset
2060
47213
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2061 # the temp file replace the real index when we exit the context
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2062 # manager
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2063
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2064 tr.replace(self._indexfile, trindex * self.index.entry_size)
100f061d88f6 revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47212
diff changeset
2065 nodemaputil.setup_persistent_nodemap(tr, self)
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2066 self._segmentfile = randomaccessfile.randomaccessfile(
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2067 self.opener,
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2068 self._datafile,
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2069 self._chunkcachesize,
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2070 )
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2071
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2072 if existing_handles:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2073 # switched from inline to conventional reopen the index
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
2074 ifh = self.__index_write_fp()
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2075 self._writinghandles = (ifh, new_dfh, None)
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2076 self._segmentfile.writing_handle = new_dfh
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2077 new_dfh = None
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2078 # No need to deal with sidedata writing handle as it is only
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2079 # relevant with revlog-v2 which is never inline, not reaching
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2080 # this code
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2081 finally:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2082 if new_dfh is not None:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2083 new_dfh.close()
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2084
39886
debc4ee597e7 revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents: 39881
diff changeset
2085 def _nodeduplicatecallback(self, transaction, node):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45870
diff changeset
2086 """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
2087
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2088 @contextlib.contextmanager
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2089 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
2090 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
2091 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
2092 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
2093 raise error.ProgrammingError(msg)
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2094 if self._writinghandles is not None:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2095 yield
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2096 else:
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2097 ifh = dfh = sdfh = 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
2098 try:
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2099 r = len(self)
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2100 # opening the data file.
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2101 dsize = 0
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2102 if r:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2103 dsize = self.end(r - 1)
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2104 dfh = None
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2105 if not self._inline:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2106 try:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2107 dfh = self._datafp(b"r+")
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2108 if self._docket is None:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2109 dfh.seek(0, os.SEEK_END)
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2110 else:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2111 dfh.seek(self._docket.data_end, os.SEEK_SET)
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2112 except IOError as inst:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2113 if inst.errno != errno.ENOENT:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2114 raise
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2115 dfh = self._datafp(b"w+")
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2116 transaction.add(self._datafile, dsize)
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2117 if self._sidedatafile is not None:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2118 try:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2119 sdfh = self.opener(self._sidedatafile, mode=b"r+")
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2120 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
2121 except IOError as inst:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2122 if inst.errno != errno.ENOENT:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2123 raise
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2124 sdfh = self.opener(self._sidedatafile, mode=b"w+")
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2125 transaction.add(
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2126 self._sidedatafile, self._docket.sidedata_end
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2127 )
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2128
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2129 # opening the index file.
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2130 isize = r * self.index.entry_size
47219
ffa8afc5f931 revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47218
diff changeset
2131 ifh = self.__index_write_fp()
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2132 if self._inline:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2133 transaction.add(self._indexfile, dsize + isize)
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2134 else:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2135 transaction.add(self._indexfile, isize)
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2136 # exposing all file handle for writing.
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2137 self._writinghandles = (ifh, dfh, sdfh)
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2138 self._segmentfile.writing_handle = ifh if self._inline else dfh
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2139 self._segmentfile_sidedata.writing_handle = sdfh
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2140 yield
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2141 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
2142 self._write_docket(transaction)
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2143 finally:
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2144 self._writinghandles = None
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2145 self._segmentfile.writing_handle = None
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2146 self._segmentfile_sidedata.writing_handle = None
47328
27e9ed1217c5 revlog: close the index file handle after the data one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47327
diff changeset
2147 if dfh is not None:
27e9ed1217c5 revlog: close the index file handle after the data one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47327
diff changeset
2148 dfh.close()
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2149 if sdfh is not None:
47413
5e44936b82be revlog: fix a typo closing the wrong file
Matt Harbison <matt_harbison@yahoo.com>
parents: 47402
diff changeset
2150 sdfh.close()
47328
27e9ed1217c5 revlog: close the index file handle after the data one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47327
diff changeset
2151 # closing the index file last to avoid exposing referent to
27e9ed1217c5 revlog: close the index file handle after the data one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47327
diff changeset
2152 # potential unflushed data content.
47327
1844a2e3401c revlog: simplify the try nesting in the `_writing` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47324
diff changeset
2153 if ifh is not 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
2154 ifh.close()
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2155
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
2156 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
2157 """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
2158
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
2159 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
2160
682f09857d69 revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
2161 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
2162 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
2163 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
2164
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2165 def addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2166 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2167 text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2168 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2169 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2170 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2171 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2172 cachedelta=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2173 node=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2174 flags=REVIDX_DEFAULT_FLAGS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2175 deltacomputer=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2176 sidedata=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2177 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2178 """add a revision to the log
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2179
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2180 text - the revision data to add
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2181 transaction - the transaction object used for rollback
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2182 link - the linkrev data to add
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2183 p1, p2 - the parent nodeids of the revision
12012
bade7a9c5c07 revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12011
diff changeset
2184 cachedelta - an optional precomputed delta
19625
6a411a06cb1f revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents: 19624
diff changeset
2185 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
2186 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
2187 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
2188 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
2189 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
2190 multiple calls
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2191 """
19326
7014526d67a8 revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents: 19200
diff changeset
2192 if link == nullrev:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2193 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
2194 _(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
2195 )
25459
0bda5bfaf0b1 revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents: 25410
diff changeset
2196
42986
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
2197 if sidedata is None:
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
2198 sidedata = {}
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
2199 elif sidedata and not self.hassidedata:
43030
827cb4fe62a3 sidedata: introduce a new requirement to protect the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43025
diff changeset
2200 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2201 _(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
2202 )
42986
33532939c667 revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42985
diff changeset
2203
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2204 if flags:
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2205 node = node or self.hash(text, p1, p2)
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2206
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2207 rawtext, validatehash = flagutil.processflagswrite(self, text, flags)
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2208
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2209 # If the flag processor modifies the revision data, ignore any provided
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2210 # cachedelta.
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2211 if rawtext != text:
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2212 cachedelta = None
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2213
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2214 if len(rawtext) > _maxentrysize:
39773
2cd93a8d4bde revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39769
diff changeset
2215 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2216 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2217 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
2218 )
47162
dfe8074239de revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47161
diff changeset
2219 % (self.display_id, len(rawtext))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2220 )
25459
0bda5bfaf0b1 revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents: 25410
diff changeset
2221
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2222 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
2223 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
2224 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
2225 return rev
12023
44c22dc193a4 revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12012
diff changeset
2226
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2227 if validatehash:
31750
f319981c24c9 revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents: 31749
diff changeset
2228 self.checkhash(rawtext, node, p1=p1, p2=p2)
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30744
diff changeset
2229
46508
f7b61ad3c64a revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents: 46507
diff changeset
2230 return self.addrawrevision(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2231 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2232 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2233 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2234 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2235 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2236 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2237 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2238 cachedelta=cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2239 deltacomputer=deltacomputer,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2240 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2241 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2242
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2243 def addrawrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2244 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2245 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2246 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2247 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2248 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2249 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2250 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2251 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2252 cachedelta=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2253 deltacomputer=None,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2254 sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2255 ):
32244
3de4c61b5087 revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents: 32229
diff changeset
2256 """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
2257 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
2258 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
2259 """
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2260 with self._writing(transaction):
46507
9ee4e988e2be revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents: 46506
diff changeset
2261 return self._addrevision(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2262 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2263 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2264 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2265 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2266 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2267 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2268 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2269 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2270 deltacomputer=deltacomputer,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2271 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2272 )
3390
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
2273
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2274 def compress(self, data):
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2275 """Generate a possibly-compressed representation of data."""
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2276 if not data:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2277 return b'', data
30795
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2278
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2279 compressed = self._compressor.compress(data)
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2280
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2281 if compressed:
78ac56aebab6 revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
2282 # The revlog compressor added the header in the returned data.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2283 return b'', compressed
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2284
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2285 if data[0:1] == b'\0':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2286 return b'', data
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2287 return b'u', data
17128
1028a1c9077a revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents: 17009
diff changeset
2288
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2289 def decompress(self, data):
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2290 """Decompress a revlog chunk.
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2291
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2292 The chunk is expected to begin with a header identifying the
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2293 format type so it can be routed to an appropriate decompressor.
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2294 """
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2295 if not data:
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2296 return data
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2297
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2298 # Revlogs are read much more frequently than they are written and many
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2299 # chunks only take microseconds to decompress, so performance is
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2300 # important here.
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2301 #
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2302 # We can make a few assumptions about revlogs:
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2303 #
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2304 # 1) the majority of chunks will be compressed (as opposed to inline
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2305 # raw data).
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2306 # 2) decompressing *any* data will likely by at least 10x slower than
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2307 # returning raw inline data.
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2308 # 3) we want to prioritize common and officially supported compression
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2309 # engines
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2310 #
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2311 # It follows that we want to optimize for "decompress compressed data
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2312 # when encoded with common and officially supported compression engines"
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2313 # case over "raw data" and "data encoded by less common or non-official
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2314 # compression engines." That is why we have the inline lookup first
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2315 # followed by the compengines lookup.
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2316 #
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2317 # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2318 # compressed chunks. And this matters for changelog and manifest reads.
31356
ef6888172437 revlog: extract first byte of revlog with a slice so it's portable
Augie Fackler <augie@google.com>
parents: 30829
diff changeset
2319 t = data[0:1]
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2320
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2321 if t == b'x':
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2322 try:
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2323 return _zlibdecompress(data)
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2324 except zlib.error as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2325 raise error.RevlogError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2326 _(b'revlog decompress error: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2327 % stringutil.forcebytestr(e)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2328 )
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2329 # '\0' is more common than 'u' so it goes first.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2330 elif t == b'\0':
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2331 return data
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2332 elif t == b'u':
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2333 return util.buffer(data, 1)
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2334
47254
eac3591abbf4 revlog: add a `_get_decompressor` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47253
diff changeset
2335 compressor = self._get_decompressor(t)
30817
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2336
2b279126b8f5 revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30795
diff changeset
2337 return compressor.decompress(data)
30793
b6f455a6e4d6 revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30792
diff changeset
2338
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2339 def _addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2340 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2341 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2342 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2343 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2344 link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2345 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2346 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2347 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2348 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2349 alwayscache=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2350 deltacomputer=None,
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2351 sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2352 ):
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
2353 """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
2354
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
2355 see addrevision for argument descriptions.
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2356
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2357 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
2358
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
2359 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
2360 be used.
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
2361
14292
c97d8485b5fa revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents: 14270
diff changeset
2362 invariants:
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2363 - 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
2364 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
2365 """
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2366 if node == self.nullid:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2367 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
2368 _(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
2369 )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2370 if (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2371 node == self.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2372 or node in self.nodeconstants.wdirfilenodeids
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46974
diff changeset
2373 ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2374 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
2375 _(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
2376 )
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2377 if self._writinghandles is None:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2378 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
2379 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
2380
35635
0b52c0ecbc23 revlog: choose between ifh and dfh once for all
Paul Morelle <paul.morelle@octobus.net>
parents: 35634
diff changeset
2381 if self._inline:
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2382 fh = self._writinghandles[0]
35635
0b52c0ecbc23 revlog: choose between ifh and dfh once for all
Paul Morelle <paul.morelle@octobus.net>
parents: 35634
diff changeset
2383 else:
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2384 fh = self._writinghandles[1]
35635
0b52c0ecbc23 revlog: choose between ifh and dfh once for all
Paul Morelle <paul.morelle@octobus.net>
parents: 35634
diff changeset
2385
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2386 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
2387
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2388 curr = len(self)
4981
e7131935fbb3 revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents: 4980
diff changeset
2389 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
2390
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
2391 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
2392
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
2393 if self._concurrencychecker:
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2394 ifh, dfh, sdfh = self._writinghandles
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2395 # 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
2396 if self._inline:
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
2397 # 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
2398 # 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
2399 self._concurrencychecker(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2400 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
2401 )
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
2402 else:
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46509
diff changeset
2403 # 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
2404 self._concurrencychecker(
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2405 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
2406 )
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
2407 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
2408
12889
5482c6b826f4 revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents: 12888
diff changeset
2409 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
2410
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
2411 # 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
2412 # become comparable to the uncompressed text
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2413 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
2414 # 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
2415 # 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
2416 # logic that might remove metadata size.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2417 textlen = mdiff.patchedsize(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2418 revlog.size(self, cachedelta[0]), cachedelta[1]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2419 )
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
2420 else:
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2421 textlen = len(rawtext)
26116
562cfc99e611 revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents: 26115
diff changeset
2422
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
2423 if deltacomputer is None:
39330
655b5b465953 revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents: 39329
diff changeset
2424 deltacomputer = deltautil.deltacomputer(self)
35738
f90f6fd130c1 revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents: 35737
diff changeset
2425
47399
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2426 revinfo = revlogutils.revisioninfo(
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2427 node,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2428 p1,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2429 p2,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2430 btext,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2431 textlen,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2432 cachedelta,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2433 flags,
34cc102c73f5 revlog: move `revisioninfo` in `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47396
diff changeset
2434 )
36744
33275ab5e837 revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents: 36743
diff changeset
2435
39332
6f4b8f607a31 revlogdeltas: move special cases around raw revisions in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39330
diff changeset
2436 deltainfo = deltacomputer.finddeltainfo(revinfo, fh)
35634
b43578ec483a revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents: 35521
diff changeset
2437
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
2438 compression_mode = COMP_MODE_INLINE
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
2439 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
2440 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
2441 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
2442 compression_mode, deltainfo = r
47253
b876f0bf7366 revlog: introduce a plain compression mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47252
diff changeset
2443
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
2444 sidedata_compression_mode = COMP_MODE_INLINE
47136
84b176ad2860 revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47134
diff changeset
2445 if sidedata and self.hassidedata:
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
2446 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
2447 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
2448 sidedata_offset = self._docket.sidedata_end
47258
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2449 h, comp_sidedata = self.compress(serialized_sidedata)
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2450 if (
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2451 h != b'u'
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2452 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
2453 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
2454 ):
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2455 assert not h
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2456 if (
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2457 comp_sidedata[0:1]
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2458 == self._docket.default_compression_header
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2459 ):
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2460 sidedata_compression_mode = COMP_MODE_DEFAULT
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2461 serialized_sidedata = comp_sidedata
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2462 else:
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2463 sidedata_compression_mode = COMP_MODE_INLINE
c4dbb7636a12 revlog: compress sidedata in `_writeentry`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47257
diff changeset
2464 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
2465 else:
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2466 serialized_sidedata = b""
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2467 # 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
2468 # 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
2469 # 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
2470 sidedata_offset = 0
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2471
47396
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
2472 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
2473 flags=flags,
8230f0204eb8 revlog: use the new `entry` function in revlog.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47394
diff changeset
2474 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
2475 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
2476 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
2477 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
2478 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
2479 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
2480 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
2481 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
2482 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
2483 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
2484 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
2485 sidedata_compression_mode=sidedata_compression_mode,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2486 )
46704
913485776542 revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
2487
38850
6104b203bec8 index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38849
diff changeset
2488 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
2489 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
2490 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
2491 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
2492 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
2493 entry = header + entry
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2494 self._writeentry(
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2495 transaction,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2496 entry,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2497 deltainfo.data,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2498 link,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2499 offset,
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2500 serialized_sidedata,
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2501 sidedata_offset,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2502 )
39333
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
2503
5d343a24bff5 revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents: 39332
diff changeset
2504 rawtext = btext[0]
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
2505
31755
ec48d57de110 revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents: 31754
diff changeset
2506 if alwayscache and rawtext is None:
39192
dbc5ead9f40f revlog: fix typo in 'buildtext' name
Boris Feld <boris.feld@octobus.net>
parents: 39191
diff changeset
2507 rawtext = deltacomputer.buildtext(revinfo, fh)
26243
836291420d53 revlog: optionally cache the full text when adding revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26242
diff changeset
2508
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2509 if type(rawtext) == bytes: # only accept immutable objects
40052
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
2510 self._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
2511 self._chainbasecache[curr] = deltainfo.chainbase
46506
07984507d553 revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents: 46469
diff changeset
2512 return curr
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
2513
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
2514 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
2515 """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
2516 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
2517 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
2518 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
2519 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
2520 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
2521
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
2522 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
2523 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
2524 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
2525 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
2526 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
2527
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2528 def _writeentry(
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2529 self, transaction, entry, data, link, offset, sidedata, sidedata_offset
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2530 ):
27430
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
2531 # 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
2532 # 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
2533 # 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
2534 # 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
2535 # 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
2536 # 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
2537 # 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
2538 #
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
2539 # 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
2540 # 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
2541 # 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
2542 # to be careful before changing this.
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2543 if self._writinghandles is None:
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2544 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
2545 raise error.ProgrammingError(msg)
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2546 ifh, dfh, sdfh = self._writinghandles
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2547 if self._docket is None:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2548 ifh.seek(0, os.SEEK_END)
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2549 else:
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2550 ifh.seek(self._docket.index_end, os.SEEK_SET)
27441
e47841c8343d revlog: fix bad indentation (replace tab by space)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27430
diff changeset
2551 if dfh:
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
2552 if self._docket is None:
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
2553 dfh.seek(0, os.SEEK_END)
4abd474a10af revlogv2: also keep track for the size of the "data" file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47241
diff changeset
2554 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
2555 dfh.seek(self._docket.data_end, os.SEEK_SET)
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2556 if sdfh:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2557 sdfh.seek(self._docket.sidedata_end, os.SEEK_SET)
27430
e240e914d226 revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26705
diff changeset
2558
20217
33394f2e331e revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents: 20180
diff changeset
2559 curr = len(self) - 1
4982
9672e3c42b0c revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents: 4981
diff changeset
2560 if not self._inline:
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
2561 transaction.add(self._datafile, offset)
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2562 if self._sidedatafile:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2563 transaction.add(self._sidedatafile, sidedata_offset)
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2564 transaction.add(self._indexfile, curr * len(entry))
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2565 if data[0]:
3390
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
2566 dfh.write(data[0])
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
2567 dfh.write(data[1])
46709
3d740058b467 sidedata: move to new sidedata storage in revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 46704
diff changeset
2568 if sidedata:
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2569 sdfh.write(sidedata)
4981
e7131935fbb3 revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents: 4980
diff changeset
2570 ifh.write(entry)
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2571 else:
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
2572 offset += curr * self.index.entry_size
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2573 transaction.add(self._indexfile, offset)
4981
e7131935fbb3 revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents: 4980
diff changeset
2574 ifh.write(entry)
3390
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
2575 ifh.write(data[0])
a74addddd092 make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3360
diff changeset
2576 ifh.write(data[1])
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2577 assert not sidedata
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2578 self._enforceinlinesize(transaction)
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2579 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
2580 self._docket.index_end = self._writinghandles[0].tell()
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
2581 self._docket.data_end = self._writinghandles[1].tell()
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2582 self._docket.sidedata_end = self._writinghandles[2].tell()
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47235
diff changeset
2583
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44073
diff changeset
2584 nodemaputil.setup_persistent_nodemap(transaction, self)
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2585
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2586 def addgroup(
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2587 self,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2588 deltas,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2589 linkmapper,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2590 transaction,
46373
711ba0f1057e revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents: 46310
diff changeset
2591 alwayscache=False,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2592 addrevisioncb=None,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2593 duplicaterevisioncb=None,
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2594 ):
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2595 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2596 add a delta group
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 45
diff changeset
2597
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2598 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
2599 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
2600 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
2601
00e3f909907f revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
2602 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
2603 this revlog and the node that was added.
1083
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2604 """
30974cf73435 Add some docstrings to revlog.py
mpm@selenic.com
parents: 1074
diff changeset
2605
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2606 if self._adding_group:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2607 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
2608
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
2609 self._adding_group = True
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2610 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
2611 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
2612 with self._writing(transaction):
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2613 deltacomputer = deltautil.deltacomputer(self)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2614 # 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
2615 for data in deltas:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2616 (
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2617 node,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2618 p1,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2619 p2,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2620 linknode,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2621 deltabase,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2622 delta,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2623 flags,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2624 sidedata,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2625 ) = data
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2626 link = linkmapper(linknode)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2627 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
2628
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2629 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
2630 if rev is not None:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2631 # 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
2632 self._nodeduplicatecallback(transaction, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2633 if duplicaterevisioncb:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2634 duplicaterevisioncb(self, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2635 empty = False
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2636 continue
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2637
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2638 for p in (p1, p2):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2639 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
2640 raise error.LookupError(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2641 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
2642 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2643
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2644 if not self.index.has_node(deltabase):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2645 raise error.LookupError(
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2646 deltabase, self.display_id, _(b'unknown delta base')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2647 )
24120
a450e0a2ba0a revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents: 24118
diff changeset
2648
47212
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2649 baserev = self.rev(deltabase)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2650
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2651 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
2652 # 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
2653 # single patch operation
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2654 hlen = struct.calcsize(b">lll")
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2655 oldlen = self.rawsize(baserev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2656 newlen = len(delta) - hlen
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2657 if delta[:hlen] != mdiff.replacediffheader(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2658 oldlen, newlen
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2659 ):
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2660 raise error.CensoredBaseError(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2661 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
2662 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2663
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2664 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
2665 flags |= REVIDX_ISCENSORED
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2666
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2667 # 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
2668 # 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
2669 # 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
2670 # 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
2671 # 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
2672 # 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
2673 # by the flagprocessor.
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2674 rev = self._addrevision(
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2675 node,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2676 None,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2677 transaction,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2678 link,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2679 p1,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2680 p2,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2681 flags,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2682 (baserev, delta),
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2683 alwayscache=alwayscache,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2684 deltacomputer=deltacomputer,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2685 sidedata=sidedata,
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2686 )
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2687
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2688 if addrevisioncb:
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2689 addrevisioncb(self, rev)
0cf537d85f4c revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47176
diff changeset
2690 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
2691 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
2692 self._adding_group = False
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 45779
diff changeset
2693 return not empty
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
2694
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
2695 def iscensored(self, rev):
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
2696 """Check if a file revision is censored."""
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2697 if not self._censorable:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2698 return False
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2699
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2700 return self.flags(rev) & REVIDX_ISCENSORED
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24030
diff changeset
2701
47166
c9ae2e7fe154 revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47165
diff changeset
2702 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
2703 """Quickly check if a delta produces a censored revision."""
37443
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2704 if not self._censorable:
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2705 return False
65250a66b55c revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37442
diff changeset
2706
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40298
diff changeset
2707 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
2708
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
2709 def getstrippoint(self, minlink):
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
2710 """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
2711
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
2712 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
2713 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
2714 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2715 return storageutil.resolvestripinfo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2716 minlink,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2717 len(self) - 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2718 self.headrevs(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2719 self.linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2720 self.parentrevs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2721 )
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
2722
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8017
diff changeset
2723 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
2724 """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
2725
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
2726 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
2727 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
2728
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
2729 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
2730 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
2731 strip.
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
2732
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
2733 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
2734 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
2735 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
2736 """
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2737 if len(self) == 0:
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2738 return
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2739
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
2740 rev, _ = self.getstrippoint(minlink)
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 20073
diff changeset
2741 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
2742 return
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2743
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2744 # 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
2745 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
2746 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
2747 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
2748 end = rev * self.index.entry_size
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2749 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
2750 end = data_end + (rev * self.index.entry_size)
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2002
diff changeset
2751
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2752 if self._sidedatafile:
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
2753 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
2754 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
2755
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2756 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
2757 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
2758 # 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
2759 # 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
2760 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
2761 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
2762 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
2763 self._docket.write(transaction, stripping=True)
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2764
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2765 # then reset internal state in memory to forget those revisions
40052
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
2766 self._revisioncache = None
45779
8719a5b68419 revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents: 45735
diff changeset
2767 self._chaininfocache = util.lrucachedict(500)
47425
e0a314bcbc9d revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents: 47414
diff changeset
2768 self._segmentfile.clear_cache()
47426
cac0e0621ceb revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents: 47425
diff changeset
2769 self._segmentfile_sidedata.clear_cache()
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2770
4979
06abdaf78788 revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents: 4978
diff changeset
2771 del self.index[rev:-1]
1535
7ae0ce7a3dc4 Add revlog.strip to truncate away revisions.
mason@suse.com
parents: 1533
diff changeset
2772
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
2773 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
2774 """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
2775
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
2776 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
2777 - 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
2778 - 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
2779
3f3f962457b2 revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41857
diff changeset
2780 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
2781 """
1493
1a216cb4ee64 verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents: 1469
diff changeset
2782 expected = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2783 if len(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2784 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
2785
1494
249ca10d37f4 Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents: 1493
diff changeset
2786 try:
35972
82afb1a5ed94 revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents: 35971
diff changeset
2787 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
2788 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
2789 actual = f.tell()
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2790 dd = actual - expected
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25459
diff changeset
2791 except IOError as inst:
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2792 if inst.errno != errno.ENOENT:
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2793 raise
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2794 dd = 0
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2795
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2796 try:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2797 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
2798 f.seek(0, io.SEEK_END)
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2799 actual = f.tell()
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13284
diff changeset
2800 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
2801 s = self.index.entry_size
9029
0001e49f1c11 compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents: 8658
diff changeset
2802 i = max(0, actual // s)
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2803 di = actual - (i * s)
4982
9672e3c42b0c revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents: 4981
diff changeset
2804 if self._inline:
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2805 databytes = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2806 for r in self:
5312
fb070713ff36 revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents: 5007
diff changeset
2807 databytes += max(0, self.length(r))
2073
1e6745f78989 Implement data inlined with the index file
mason@suse.com
parents: 2072
diff changeset
2808 dd = 0
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6703
diff changeset
2809 di = actual - len(self) * s - databytes
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25459
diff changeset
2810 except IOError as inst:
1667
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2811 if inst.errno != errno.ENOENT:
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2812 raise
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2813 di = 0
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2814
daff3ef0de8d verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents: 1660
diff changeset
2815 return (dd, di)
6891
22cb82433842 revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents: 6872
diff changeset
2816
22cb82433842 revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents: 6872
diff changeset
2817 def files(self):
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
2818 res = [self._indexfile]
47450
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
2819 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
2820 if not self._inline:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
2821 res.append(self._datafile)
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
2822 else:
9cecc222c536 revlogv2: fix `hg verify` with revlog v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47426
diff changeset
2823 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
2824 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
2825 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
2826 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
2827 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
2828 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
2829 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
2830 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
2831 return res
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2832
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2833 def emitrevisions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2834 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2835 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2836 nodesorder=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2837 revisiondata=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2838 assumehaveparentrevisions=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2839 deltamode=repository.CG_DELTAMODE_STD,
46715
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46712
diff changeset
2840 sidedata_helpers=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2841 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2842 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
2843 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2844 b'unhandled value for nodesorder: %s' % nodesorder
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2845 )
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
2846
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
2847 if nodesorder is None and not self._generaldelta:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2848 nodesorder = b'storage'
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
2849
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2850 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2851 not self._storedeltachains
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2852 and deltamode != repository.CG_DELTAMODE_PREV
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2853 ):
40427
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
2854 deltamode = repository.CG_DELTAMODE_FULL
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
2855
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2856 return storageutil.emitrevisions(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2857 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2858 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2859 nodesorder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2860 revlogrevisiondelta,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2861 deltaparentfn=self.deltaparent,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2862 candeltafn=self.candelta,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2863 rawsizefn=self.rawsize,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2864 revdifffn=self.revdiff,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2865 flagsfn=self.flags,
40427
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
2866 deltamode=deltamode,
40008
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
2867 revisiondata=revisiondata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2868 assumehaveparentrevisions=assumehaveparentrevisions,
46715
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46712
diff changeset
2869 sidedata_helpers=sidedata_helpers,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2870 )
39862
5a9ab91e0a45 revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39845
diff changeset
2871
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2872 DELTAREUSEALWAYS = b'always'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2873 DELTAREUSESAMEREVS = b'samerevs'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2874 DELTAREUSENEVER = b'never'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2875
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2876 DELTAREUSEFULLADD = b'fulladd'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2877
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2878 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
2879
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2880 def clone(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2881 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2882 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2883 destrevlog,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2884 addrevisioncb=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2885 deltareuse=DELTAREUSESAMEREVS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2886 forcedeltabothparents=None,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
2887 sidedata_helpers=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2888 ):
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2889 """Copy this revlog to another, possibly with format changes.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2890
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2891 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
2892 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
2893 differences.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2894
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2895 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
2896 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
2897 following values:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2898
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2899 DELTAREUSEALWAYS
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2900 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
2901 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
2902 fastest mode of operation.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2903 DELTAREUSESAMEREVS
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2904 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
2905 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
2906 and optimization.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2907 DELTAREUSENEVER
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2908 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
2909 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
2910 algorithm changes).
42997
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
2911 DELTAREUSEFULLADD
6510c7830838 upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42996
diff changeset
2912 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
2913 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
2914 eg: large file detection and handling.
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2915
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2916 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
2917 significantly affect run time.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2918
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2919 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2920 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
2921 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
2922 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
2923 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
2924 revision.
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2925
40837
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
2926 In addition to the delta policy, the ``forcedeltabothparents``
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
2927 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
2928 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
2929
47086
8bd769b5c941 sidedata: move documentation about sidedata helpers to sidedata module
Raphaël Gomès <rgomes@octobus.net>
parents: 47085
diff changeset
2930 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
2931 `sidedata_helpers`.
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2932 """
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2933 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
2934 raise ValueError(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2935 _(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
2936 )
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2937
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2938 if len(destrevlog):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2939 raise ValueError(_(b'destination revlog is not empty'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2940
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2941 if getattr(self, 'filteredrevs', None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2942 raise ValueError(_(b'source revlog has filtered revisions'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2943 if getattr(destrevlog, 'filteredrevs', None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2944 raise ValueError(_(b'destination revlog has filtered revisions'))
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2945
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2946 # 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
2947 # if possible.
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2948 oldlazydelta = destrevlog._lazydelta
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2949 oldlazydeltabase = destrevlog._lazydeltabase
38736
93777d16a25d aggressivemergedeltas: rename variable internally
Boris Feld <boris.feld@octobus.net>
parents: 38718
diff changeset
2950 oldamd = destrevlog._deltabothparents
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2951
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2952 try:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2953 if deltareuse == self.DELTAREUSEALWAYS:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2954 destrevlog._lazydeltabase = True
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2955 destrevlog._lazydelta = True
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2956 elif deltareuse == self.DELTAREUSESAMEREVS:
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2957 destrevlog._lazydeltabase = False
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2958 destrevlog._lazydelta = True
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2959 elif deltareuse == self.DELTAREUSENEVER:
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2960 destrevlog._lazydeltabase = False
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2961 destrevlog._lazydelta = False
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2962
40837
64051af15596 upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
2963 destrevlog._deltabothparents = forcedeltabothparents or oldamd
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2964
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2965 self._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
2966 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
2967 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
2968 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
2969 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
2970 forcedeltabothparents,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
2971 sidedata_helpers,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2972 )
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
2973
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2974 finally:
41857
afd37ed731f1 revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
2975 destrevlog._lazydelta = oldlazydelta
30778
1c7368d1a25f revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30746
diff changeset
2976 destrevlog._lazydeltabase = oldlazydeltabase
38736
93777d16a25d aggressivemergedeltas: rename variable internally
Boris Feld <boris.feld@octobus.net>
parents: 38718
diff changeset
2977 destrevlog._deltabothparents = oldamd
39778
a6b3c4c1019f revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39775
diff changeset
2978
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2979 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
2980 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
2981 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
2982 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
2983 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
2984 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
2985 forcedeltabothparents,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
2986 sidedata_helpers,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2987 ):
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
2988 """perform the core duty of `revlog.clone` after parameter processing"""
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
2989 deltacomputer = deltautil.deltacomputer(destrevlog)
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
2990 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
2991 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
2992 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
2993
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
2994 # 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
2995 # account. Use raw entry from index.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
2996 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
2997 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
2998 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
2999 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
3000 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
3001
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3002 # (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
3003 # 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
3004 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
3005 rawtext = None
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3006 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
3007 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
3008 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
3009
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3010 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
3011 (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
3012 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
3013 )
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3014 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
3015
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3016 destrevlog.addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3017 text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3018 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3019 linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3020 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3021 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3022 cachedelta=cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3023 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3024 flags=flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3025 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
3026 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3027 )
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
3028 else:
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3029 if destrevlog._lazydelta:
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3030 dp = self.deltaparent(rev)
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3031 if dp != nullrev:
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3032 cachedelta = (dp, bytes(self._chunk(rev)))
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3033
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3034 sidedata = None
42998
8a31294fa25c upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42997
diff changeset
3035 if not cachedelta:
47385
9d9eb22b9b69 revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47384
diff changeset
3036 rawtext = 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
3037 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
3038 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
3039 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
3040
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3041 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
3042 (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
3043 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
3044 )
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3045 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
3046
47214
906a7bcaac86 revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47213
diff changeset
3047 with destrevlog._writing(tr):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3048 destrevlog._addrevision(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3049 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3050 rawtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3051 tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3052 linkrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3053 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3054 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3055 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3056 cachedelta,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3057 deltacomputer=deltacomputer,
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3058 sidedata=sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3059 )
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
3060
4f2315cce1db upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42995
diff changeset
3061 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
3062 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
3063
40056
324b4b10351e revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40055
diff changeset
3064 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
3065 if self._format_version == REVLOGV0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3066 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
3067 _(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
3068 % self._format_version
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3069 )
47391
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
3070 elif self._format_version == REVLOGV1:
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
3071 censor.v1_censor(self, tr, censornode, tombstone)
33d626910374 revlog: move censoring code in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47389
diff changeset
3072 else:
47457
f8330a3fc39f censor: implement censoring for revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47455
diff changeset
3073 censor.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
3074
39842
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3075 def verifyintegrity(self, state):
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3076 """Verifies the integrity of the revlog.
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3077
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3078 Yields ``revlogproblem`` instances describing problems that are
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3079 found.
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3080 """
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3081 dd, di = self.checksize()
97986c9c69d3 verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39831
diff changeset
3082 if dd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3083 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
3084 if di:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3085 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
3086
47139
f58a13c52726 revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47136
diff changeset
3087 version = self._format_version
39845
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
3088
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
3089 # 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
3090 if version != state[b'expectedversion']:
39845
e6d3d39cc1c7 revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39842
diff changeset
3091 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3092 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
3093 % (self.display_id, version, state[b'expectedversion'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3094 )
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3095
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3096 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
3097 state[b'safe_renamed'] = set()
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3098
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3099 for rev in self:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3100 node = self.node(rev)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3101
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3102 # 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
3103 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3104 # common: the most common case
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3105 # rename: with a rename
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3106 # 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
3107 # 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
3108 # ext: content stored externally
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3109 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3110 # 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
3111 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3112 # | common | rename | meta | ext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3113 # -------------------------------------------------------
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3114 # flags() | 0 | 0 | 0 | not 0
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3115 # renamed() | False | True | False | ?
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3116 # 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
3117 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3118 # "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
3119 # 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
3120 # mentioned below is "revision(rev)".
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3121 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3122 # 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
3123 # 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
3124 # 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
3125 # 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
3126 # possibly somewhere else if flags!=0
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3127 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3128 # 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
3129 # "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
3130 # processors (see flagutil.addflagprocessor).
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3131 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3132 # | common | rename | meta | ext
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3133 # -------------------------------------------------
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3134 # rawsize() | L1 | L1 | L1 | L1
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3135 # size() | L1 | L2-LM | L1(*) | L1 (?)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3136 # len(rawtext) | L2 | L2 | L2 | L2
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3137 # len(text) | L2 | L2 | L2 | L3
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3138 # 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
3139 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3140 # 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
3141 # (*): 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
3142 # (?): 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
3143 # rename metadata
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3144 #
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3145 # Checks needed to be done:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3146 # 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
3147 # 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
3148 # 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
3149
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3150 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3151 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
3152 if skipflags:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3153 skipflags &= self.flags(rev)
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3154
43957
7c3118b9a9db revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents: 43779
diff changeset
3155 _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
3156
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3157 l1 = self.rawsize(rev)
42768
5a8f2c8edff6 rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
3158 l2 = len(self.rawdata(node))
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3159
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3160 if l1 != l2:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3161 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3162 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
3163 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3164 )
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3165
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3166 except error.CensoredNodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3167 if state[b'erroroncensored']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3168 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3169 error=_(b'censored file data'), node=node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3170 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3171 state[b'skipread'].add(node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3172 except Exception as e:
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3173 yield revlogproblem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3174 error=_(b'unpacking %s: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3175 % (short(node), stringutil.forcebytestr(e)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3176 node=node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3177 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3178 state[b'skipread'].add(node)
39872
733db72f0f54 revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39869
diff changeset
3179
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3180 def storageinfo(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3181 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3182 exclusivefiles=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3183 sharedfiles=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3184 revisionscount=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3185 trackedsize=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3186 storedsize=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3187 ):
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3188 d = {}
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3189
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3190 if exclusivefiles:
47148
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47145
diff changeset
3191 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
3192 if not self._inline:
47149
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47148
diff changeset
3193 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
3194
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3195 if sharedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3196 d[b'sharedfiles'] = []
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3197
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3198 if revisionscount:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3199 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
3200
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3201 if trackedsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3202 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
3203
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3204 if storedsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3205 d[b'storedsize'] = sum(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43039
diff changeset
3206 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
3207 )
39869
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3208
14e500b58263 revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39866
diff changeset
3209 return d
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3210
47216
2bd4b5218918 revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47215
diff changeset
3211 def rewrite_sidedata(self, transaction, helpers, startrev, endrev):
47136
84b176ad2860 revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47134
diff changeset
3212 if not self.hassidedata:
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3213 return
47234
616b8f412676 revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47231
diff changeset
3214 # 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
3215 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
3216 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
3217 # 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
3218 return
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3219
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3220 new_entries = []
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3221 # append the new sidedata
47218
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
3222 with self._writing(transaction):
47389
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3223 ifh, dfh, sdfh = self._writinghandles
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3224 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
3225
e6292eb33384 revlog: store sidedata in their own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47387
diff changeset
3226 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
3227 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
3228 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
3229 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
3230 store=self,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3231 sidedata_helpers=helpers,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3232 sidedata={},
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3233 rev=rev,
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3234 )
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3235
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3236 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
3237 new_sidedata
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3238 )
47259
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3239
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3240 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
3241 if serialized_sidedata and self.hassidedata:
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3242 sidedata_compression_mode = COMP_MODE_PLAIN
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3243 h, comp_sidedata = self.compress(serialized_sidedata)
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3244 if (
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3245 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
3246 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
3247 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
3248 ):
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3249 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
3250 if (
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3251 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
3252 == 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
3253 ):
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3254 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
3255 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
3256 else:
07641bafa646 revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47258
diff changeset
3257 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
3258 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
3259 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
3260 # 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
3261 # 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
3262 # revlog.
47228
e51392acd70c revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47222
diff changeset
3263 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
3264 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
3265
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47077
diff changeset
3266 # 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
3267 # the sidedata helpers
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47077
diff changeset
3268 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
3269 entry_update = (
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
3270 current_offset,
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
3271 len(serialized_sidedata),
de63be070e02 revlog: simplify entry update logic in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47242
diff changeset
3272 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
3273 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
3274 )
46718
ba8e508a8e69 sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Raphaël Gomès <rgomes@octobus.net>
parents: 46716
diff changeset
3275
47217
8f6165c90163 revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47216
diff changeset
3276 # 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
3277 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
3278 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
3279 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
3280 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
3281 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
3282
47218
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
3283 # rewrite the new index entries
b3acefded601 revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47217
diff changeset
3284 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
3285 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
3286 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
3287 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
3288 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
3289 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
3290 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
3291 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
3292 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
3293 ifh.write(packed)