Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/revlog.py @ 47250:682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
This prevent external reader to see the transaction content before it is
commited. However this also prevent the hooks to see the transaction content.
We will fix this in later changesets.
We have to temporarily suppress the error output of the command ran during the
transaction as they sometimes get confused about unknown working directory and
sometimes issue message on std-err in unspecified order.
Differential Revision: https://phab.mercurial-scm.org/D10629
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 12:35:02 +0200 |
parents | 6597255a4f94 |
children | 4f38ada3fc26 |
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 |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46807
diff
changeset
|
3 # 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
|
4 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # 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
|
7 |
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
8 """Storage back-end for Mercurial. |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
9 |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
10 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
|
11 and O(changes) merge between branches. |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
12 """ |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
13 |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
14 from __future__ import absolute_import |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
15 |
46852
fbfb1d6d8459
revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
46819
diff
changeset
|
16 import binascii |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
17 import collections |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
18 import contextlib |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
19 import errno |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
20 import io |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
21 import os |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
22 import struct |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
23 import zlib |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
24 |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
25 # import stuff from node for others to import from revlog |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
26 from .node import ( |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
27 bin, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
28 hex, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
29 nullrev, |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
30 sha1nodeconstants, |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
31 short, |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
32 wdirrev, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
33 ) |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
34 from .i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
35 from .pycompat import getattr |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
36 from .revlogutils.constants import ( |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
37 ALL_KINDS, |
47242
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
38 FEATURES_BY_VERSION, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
39 FLAG_GENERALDELTA, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
40 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
|
41 INDEX_HEADER, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
42 REVLOGV0, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
43 REVLOGV1, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
44 REVLOGV1_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
45 REVLOGV2, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
46 REVLOGV2_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
47 REVLOG_DEFAULT_FLAGS, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
48 REVLOG_DEFAULT_FORMAT, |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
49 REVLOG_DEFAULT_VERSION, |
47241
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
50 SUPPORTED_FLAGS, |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
51 ) |
42745
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
52 from .revlogutils.flagutil import ( |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
53 REVIDX_DEFAULT_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
54 REVIDX_ELLIPSIS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
55 REVIDX_EXTSTORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
56 REVIDX_FLAGS_ORDER, |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45054
diff
changeset
|
57 REVIDX_HASCOPIESINFO, |
42745
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
58 REVIDX_ISCENSORED, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
59 REVIDX_RAWTEXT_CHANGING_FLAGS, |
ca5ca3badd3c
flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42736
diff
changeset
|
60 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
61 from .thirdparty import attr |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
62 from . import ( |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
63 ancestor, |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
64 dagop, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
65 error, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
66 mdiff, |
32411
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32355
diff
changeset
|
67 policy, |
31580
a8e55d6f1d67
revlog: use pycompat.maplist to eagerly evaluate map on Python 3
Augie Fackler <augie@google.com>
parents:
31511
diff
changeset
|
68 pycompat, |
27361
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
69 templatefilters, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
70 util, |
29f50344fa83
revlog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27251
diff
changeset
|
71 ) |
42823
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
72 from .interfaces import ( |
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
73 repository, |
42824
2c4f656c8e9f
interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42823
diff
changeset
|
74 util as interfaceutil, |
42823
268662aac075
interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42808
diff
changeset
|
75 ) |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
76 from .revlogutils import ( |
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
77 deltas as deltautil, |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
78 docket as docketutil, |
42746
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42745
diff
changeset
|
79 flagutil, |
44035
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44017
diff
changeset
|
80 nodemap as nodemaputil, |
47079
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
81 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
|
82 sidedata as sidedatautil, |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
83 ) |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
84 from .utils import ( |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
85 storageutil, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
86 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36768
diff
changeset
|
87 ) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
88 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
89 # blanked usage of all the name to prevent pyflakes constraints |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
90 # We need these name available in the module for extensions. |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
91 |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
92 REVLOGV0 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
93 REVLOGV1 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
94 REVLOGV2 |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
95 FLAG_INLINE_DATA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
96 FLAG_GENERALDELTA |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
97 REVLOG_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
98 REVLOG_DEFAULT_FORMAT |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
99 REVLOG_DEFAULT_VERSION |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
100 REVLOGV1_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
101 REVLOGV2_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
102 REVIDX_ISCENSORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
103 REVIDX_ELLIPSIS |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45054
diff
changeset
|
104 REVIDX_HASCOPIESINFO |
39356
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
105 REVIDX_EXTSTORED |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
106 REVIDX_DEFAULT_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
107 REVIDX_FLAGS_ORDER |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
108 REVIDX_RAWTEXT_CHANGING_FLAGS |
729082bb9938
revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents:
39260
diff
changeset
|
109 |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
110 parsers = policy.importmod('parsers') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
111 rustancestor = policy.importrust('ancestor') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43492
diff
changeset
|
112 rustdagop = policy.importrust('dagop') |
44017
8042856c90b6
rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents:
43984
diff
changeset
|
113 rustrevlog = policy.importrust('revlog') |
32411
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32355
diff
changeset
|
114 |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
115 # Aliased for performance. |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
116 _zlibdecompress = zlib.decompress |
5007
3addf4531643
revlog: localize some fastpath functions
Matt Mackall <mpm@selenic.com>
parents:
5006
diff
changeset
|
117 |
10916
9c84395a338e
add documentation for revlog._prereadsize
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10914
diff
changeset
|
118 # max size of revlog with inline data |
9c84395a338e
add documentation for revlog._prereadsize
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10914
diff
changeset
|
119 _maxinline = 131072 |
13253 | 120 _chunksize = 1048576 |
10913
f2ecc5733c89
revlog: factor out _maxinline global.
Greg Ward <greg-hg@gerg.ca>
parents:
10404
diff
changeset
|
121 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
122 # Flag processors for REVIDX_ELLIPSIS. |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
123 def ellipsisreadprocessor(rl, text): |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
124 return text, False |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
125 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
126 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
127 def ellipsiswriteprocessor(rl, text): |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
128 return text, False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
129 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
130 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
131 def ellipsisrawprocessor(rl, text): |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
132 return False |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
133 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
134 |
39783
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
135 ellipsisprocessor = ( |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
136 ellipsisreadprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
137 ellipsiswriteprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
138 ellipsisrawprocessor, |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
139 ) |
db088e133e91
revlog: define ellipsis flag processors in core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39360
diff
changeset
|
140 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
141 |
4987
8d30004ada40
revlog: some basic code reordering
Matt Mackall <mpm@selenic.com>
parents:
4986
diff
changeset
|
142 def offset_type(offset, type): |
42747
92ac6b1697a7
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42746
diff
changeset
|
143 if (type & ~flagutil.REVIDX_KNOWN_FLAGS) != 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
144 raise ValueError(b'unknown revlog index flags') |
31511
73aa13bc8dac
revlog: use int instead of long
Augie Fackler <augie@google.com>
parents:
31378
diff
changeset
|
145 return int(int(offset) << 16 | type) |
4987
8d30004ada40
revlog: some basic code reordering
Matt Mackall <mpm@selenic.com>
parents:
4986
diff
changeset
|
146 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
147 |
43962
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
148 def _verify_revision(rl, skipflags, state, node): |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
149 """Verify the integrity of the given revlog ``node`` while providing a hook |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
150 point for extensions to influence the operation.""" |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
151 if skipflags: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
152 state[b'skipread'].add(node) |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
153 else: |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
154 # Side-effect: read content and verify hash. |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
155 rl.revision(node) |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
156 |
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
157 |
46310
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
158 # True if a fast implementation for persistent-nodemap is available |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
159 # |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
160 # We also consider we have a "fast" implementation in "pure" python because |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
161 # people using pure don't really have performance consideration (and a |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
162 # 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:
45957
diff
changeset
|
163 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:
45957
diff
changeset
|
164 parsers, 'BaseIndexObject' |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
165 ) |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
166 |
fc2d5c0aed7f
persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
167 |
35641
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
168 @attr.s(slots=True, frozen=True) |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
169 class _revisioninfo(object): |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
170 """Information about a revision that allows building its fulltext |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
171 node: expected hash of the revision |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
172 p1, p2: parent revs of the revision |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
173 btext: built text cache consisting of a one-element list |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
174 cachedelta: (baserev, uncompressed_delta) or None |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
175 flags: flags associated to the revision storage |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
176 |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
177 One of btext[0] or cachedelta must be set. |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
178 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
179 |
35641
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
180 node = attr.ib() |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
181 p1 = attr.ib() |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
182 p2 = attr.ib() |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
183 btext = attr.ib() |
35737
d99b07bc69fb
revlog: refactor out _finddeltainfo from _addrevision
Paul Morelle <paul.morelle@octobus.net>
parents:
35641
diff
changeset
|
184 textlen = attr.ib() |
35641
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
185 cachedelta = attr.ib() |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
186 flags = attr.ib() |
c41bb85c09ff
revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net>
parents:
35640
diff
changeset
|
187 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
188 |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
189 @interfaceutil.implementer(repository.irevisiondelta) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
190 @attr.s(slots=True) |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
191 class revlogrevisiondelta(object): |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
192 node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
193 p1node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
194 p2node = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
195 basenode = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
196 flags = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
197 baserevisionsize = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
198 revision = attr.ib() |
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
199 delta = attr.ib() |
46725
e8c11a2c96c0
delta: add sidedata field to revision delta
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46724
diff
changeset
|
200 sidedata = attr.ib() |
47094
119790e1c67c
cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47092
diff
changeset
|
201 protocol_flags = attr.ib() |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
202 linknode = attr.ib(default=None) |
39259
b41d023a412a
repository: establish API for emitting revision deltas
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39225
diff
changeset
|
203 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
204 |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
205 @interfaceutil.implementer(repository.iverifyproblem) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
206 @attr.s(frozen=True) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
207 class revlogproblem(object): |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
208 warning = attr.ib(default=None) |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
209 error = attr.ib(default=None) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
210 node = attr.ib(default=None) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
211 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
212 |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
213 def parse_index_v1(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
214 # call the C implementation to parse the index data |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
215 index, cache = parsers.parse_index2(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
216 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
217 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
218 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
219 def parse_index_v2(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
220 # call the C implementation to parse the index data |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
221 index, cache = parsers.parse_index2(data, inline, revlogv2=True) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
222 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
223 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
224 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
225 if util.safehasattr(parsers, 'parse_index_devel_nodemap'): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
226 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
227 def parse_index_v1_nodemap(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
228 index, cache = parsers.parse_index_devel_nodemap(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
229 return index, cache |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
230 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
231 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
232 else: |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
233 parse_index_v1_nodemap = None |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
234 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
235 |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
236 def parse_index_v1_mixed(data, inline): |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
237 index, cache = parse_index_v1(data, inline) |
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
238 return rustrevlog.MixedIndex(index), cache |
4972
8d0cf46e0dc6
revlog: add revlogio interface
Matt Mackall <mpm@selenic.com>
parents:
4971
diff
changeset
|
239 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
240 |
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
|
241 # 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
|
242 # signed integer) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
243 _maxentrysize = 0x7FFFFFFF |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
244 |
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
|
245 |
42997
73288e7abe9b
flagprocessors: remove flagprocessorsmixin
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42996
diff
changeset
|
246 class revlog(object): |
1083 | 247 """ |
248 the underlying revision storage object | |
249 | |
250 A revlog consists of two parts, an index and the revision data. | |
251 | |
252 The index is a file with a fixed record size containing | |
6912 | 253 information on each revision, including its nodeid (hash), the |
1083 | 254 nodeids of its parents, the position and offset of its data within |
255 the data file, and the revision it's based on. Finally, each entry | |
256 contains a linkrev entry that can serve as a pointer to external | |
257 data. | |
258 | |
259 The revision data itself is a linear collection of data chunks. | |
260 Each chunk represents a revision and is usually represented as a | |
261 delta against the previous chunk. To bound lookup time, runs of | |
262 deltas are limited to about 2 times the length of the original | |
263 version data. This makes retrieval of a version proportional to | |
264 its size, or O(1) relative to the number of revisions. | |
265 | |
266 Both pieces of the revlog are written to in an append-only | |
267 fashion, which means we never need to rewrite a file to insert or | |
268 remove data, and can use some simple techniques to avoid the need | |
269 for locking while reading. | |
30001
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
270 |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
271 If checkambig, indexfile is opened with checkambig=True at |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
272 writing, to avoid file stat ambiguity. |
34303
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
273 |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
274 If mmaplargeindex is True, and an mmapindexthreshold is set, the |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
275 index will be mmapped rather than read if it is larger than the |
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
276 configured threshold. |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
277 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
278 If censorable is True, the revlog can have censored revisions. |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
279 |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
280 If `upperboundcomp` is not None, this is the expected maximal gain from |
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
281 compression for the data content. |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
282 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
283 `concurrencychecker` is an optional function that receives 3 arguments: a |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
284 file handle, a filename, and an expected position. It should check whether |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
285 the current position in the file handle is valid, and log/warn/fail (by |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
286 raising). |
1083 | 287 """ |
42996
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
288 |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
289 _flagserrorclass = error.RevlogError |
3674797ae8b9
flagprocessors: move _flagserrorclass attribute on revlog & co
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42995
diff
changeset
|
290 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
291 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
292 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
293 opener, |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
294 target, |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
295 radix, |
47159
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
296 postfix=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
297 checkambig=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
298 mmaplargeindex=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
299 censorable=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
300 upperboundcomp=None, |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
301 persistentnodemap=False, |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
302 concurrencychecker=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
303 ): |
1083 | 304 """ |
305 create a revlog object | |
306 | |
307 opener is a function that abstracts the file opening operation | |
308 and can be used to implement COW semantics or the like. | |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
309 |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
310 `target`: a (KIND, ID) tuple that identify the content stored in |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
311 this revlog. It help the rest of the code to understand what the revlog |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
312 is about without having to resort to heuristic and index filename |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
313 analysis. Note: that this must be reliably be set by normal code, but |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
314 that test, debug, or performance measurement code might not set this to |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
315 accurate value. |
1083 | 316 """ |
42478
bc4373babd04
revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42468
diff
changeset
|
317 self.upperboundcomp = upperboundcomp |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
318 |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
319 self.radix = radix |
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
320 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
321 self._docket_file = None |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
322 self._indexfile = None |
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
323 self._datafile = None |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
324 self._nodemap_file = None |
47159
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
325 self.postfix = postfix |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
326 self.opener = opener |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
327 if persistentnodemap: |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
328 self._nodemap_file = nodemaputil.get_nodemap_file(self) |
47165
24be247a13b4
revlog: stop usage of `_indexfile` to computing nodemap path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47164
diff
changeset
|
329 |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
330 assert target[0] in ALL_KINDS |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
331 assert len(target) == 2 |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
332 self.target = target |
30001
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
333 # 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:
29841
diff
changeset
|
334 # avoid file stat ambiguity. |
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29841
diff
changeset
|
335 self._checkambig = checkambig |
41203
d0de4fdd87aa
revlog: store mmaplargeindex as an instance attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41202
diff
changeset
|
336 self._mmaplargeindex = mmaplargeindex |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
337 self._censorable = censorable |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
338 # 3-tuple of (node, rev, text) for a raw revision. |
40053
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
339 self._revisioncache = None |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
340 # Maps rev to chain base rev. |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
341 self._chainbasecache = util.lrucachedict(100) |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
342 # 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
|
343 self._chunkcache = (0, b'') |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
344 # 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
|
345 self._chunkcachesize = 65536 |
23255
76effa770ff9
revlog: add config variable for limiting delta-chain length
Mateusz Kwapich <mitrandir@fb.com>
parents:
23254
diff
changeset
|
346 self._maxchainlen = None |
38736
93777d16a25d
aggressivemergedeltas: rename variable internally
Boris Feld <boris.feld@octobus.net>
parents:
38718
diff
changeset
|
347 self._deltabothparents = True |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
348 self.index = None |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
349 self._docket = None |
44366
76a96e3a2bbb
nodemap: keep track of the docket for loaded data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
350 self._nodemap_docket = None |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
351 # 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
|
352 self._pcache = {} |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
353 # 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
|
354 self._compengine = b'zlib' |
42043
1fac9b931d46
compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41877
diff
changeset
|
355 self._compengineopts = {} |
33207
895ecec31c70
revlog: add an experimental option to mitigated delta issues (issue5480)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33173
diff
changeset
|
356 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
|
357 self._withsparseread = False |
38717
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38716
diff
changeset
|
358 self._sparserevlog = False |
47233
c2180093682a
revlog: determine sidedata support based on the revlog version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47230
diff
changeset
|
359 self.hassidedata = False |
38632
eb8504715071
sparse-read: target density of 50% instead of 25%
Paul Morelle <paul.morelle@octobus.net>
parents:
38603
diff
changeset
|
360 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
|
361 self._srmingapsize = 262144 |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
362 |
39784
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
363 # Make copy of flag processors so each revlog instance can support |
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
364 # custom flags. |
42746
05c80f9ef100
flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42745
diff
changeset
|
365 self._flagprocessors = dict(flagutil.flagprocessors) |
39784
7b2b42fc377a
revlog: store flag processors per revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39783
diff
changeset
|
366 |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
367 # 2-tuple of file handles being used for active writing. |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
368 self._writinghandles = None |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
369 # prevent nesting of addgroup |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
370 self._adding_group = None |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
371 |
41204
e3cfe0702eac
revlog: inline opener options logic into _loadindex()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41203
diff
changeset
|
372 self._loadindex() |
e3cfe0702eac
revlog: inline opener options logic into _loadindex()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41203
diff
changeset
|
373 |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
374 self._concurrencychecker = concurrencychecker |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
375 |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
376 def _init_opts(self): |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
377 """process options (from above/config) to setup associated default revlog mode |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
378 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
379 These values might be affected when actually reading on disk information. |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
380 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
381 The relevant values are returned for use in _loadindex(). |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
382 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
383 * newversionflags: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
384 version header to use if we need to create a new revlog |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
385 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
386 * mmapindexthreshold: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
387 minimal index size for start to use mmap |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
388 |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
389 * force_nodemap: |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
390 force the usage of a "development" version of the nodemap code |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
391 """ |
34303
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34298
diff
changeset
|
392 mmapindexthreshold = None |
43027
3518da504303
vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43026
diff
changeset
|
393 opts = self.opener.options |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
394 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
395 if b'revlogv2' in opts: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
396 new_header = REVLOGV2 | FLAG_INLINE_DATA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
397 elif b'revlogv1' in opts: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
398 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
|
399 if b'generaldelta' in opts: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
400 new_header |= FLAG_GENERALDELTA |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
401 elif b'revlogv0' in self.opener.options: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
402 new_header = REVLOGV0 |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
403 else: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
404 new_header = REVLOG_DEFAULT_VERSION |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
405 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 if b'chunkcachesize' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
407 self._chunkcachesize = opts[b'chunkcachesize'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
408 if b'maxchainlen' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
409 self._maxchainlen = opts[b'maxchainlen'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
410 if b'deltabothparents' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
411 self._deltabothparents = opts[b'deltabothparents'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
412 self._lazydelta = bool(opts.get(b'lazydelta', True)) |
41824
688fc33e105d
storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41773
diff
changeset
|
413 self._lazydeltabase = False |
688fc33e105d
storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41773
diff
changeset
|
414 if self._lazydelta: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
415 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
|
416 if b'compengine' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
417 self._compengine = opts[b'compengine'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
418 if b'zlib.level' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
419 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
|
420 if b'zstd.level' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
421 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
|
422 if b'maxdeltachainspan' in opts: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
423 self._maxdeltachainspan = opts[b'maxdeltachainspan'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
424 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
|
425 mmapindexthreshold = opts[b'mmapindexthreshold'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
426 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
|
427 withsparseread = bool(opts.get(b'with-sparse-read', False)) |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
428 # sparse-revlog forces sparse-read |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
429 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
|
430 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
|
431 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
|
432 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
|
433 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
|
434 if opts.get(b'enableellipsis'): |
41200
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
435 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
436 |
cecf3f8bccd3
revlog: always process opener options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41118
diff
changeset
|
437 # 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
|
438 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
|
439 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
|
440 ): |
42748
5109217a9ab6
flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42747
diff
changeset
|
441 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
|
442 |
20180
969148b49fc6
revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents:
20179
diff
changeset
|
443 if self._chunkcachesize <= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
444 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
|
445 _(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
|
446 % self._chunkcachesize |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
447 ) |
20180
969148b49fc6
revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents:
20179
diff
changeset
|
448 elif self._chunkcachesize & (self._chunkcachesize - 1): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
449 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
|
450 _(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
|
451 % self._chunkcachesize |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
452 ) |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
453 force_nodemap = opts.get(b'devel-force-nodemap', False) |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
454 return new_header, mmapindexthreshold, force_nodemap |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
455 |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
456 def _get_data(self, filepath, mmap_threshold, size=None): |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
457 """return a file content with or without mmap |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
458 |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
459 If the file is missing return the empty string""" |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
460 try: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
461 with self.opener(filepath) as fp: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
462 if mmap_threshold is not None: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
463 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:
47182
diff
changeset
|
464 if file_size >= mmap_threshold: |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
465 if size is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
466 # avoid potentiel mmap crash |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
467 size = min(file_size, size) |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
468 # TODO: should .close() to release resources without |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
469 # relying on Python GC |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
470 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
471 return util.buffer(util.mmapread(fp)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
472 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
473 return util.buffer(util.mmapread(fp, size)) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
474 if size is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
475 return fp.read() |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
476 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
477 return fp.read(size) |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
478 except IOError as inst: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
479 if inst.errno != errno.ENOENT: |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
480 raise |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
481 return b'' |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
482 |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
483 def _loadindex(self): |
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
484 |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
485 new_header, mmapindexthreshold, force_nodemap = self._init_opts() |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
486 |
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
487 if self.postfix is None: |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
488 entry_point = b'%s.i' % self.radix |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
489 else: |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
490 entry_point = b'%s.i.%s' % (self.radix, self.postfix) |
47182
cacb08f357ed
revlog: define the actual index and datafile at loading time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47181
diff
changeset
|
491 |
47190
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
492 entry_data = b'' |
14334
85c82ebc96a3
changelog: don't use generaldelta
Sune Foldager <cryo@cyanite.org>
parents:
14333
diff
changeset
|
493 self._initempty = True |
47190
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
494 entry_data = self._get_data(entry_point, mmapindexthreshold) |
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
495 if len(entry_data) > 0: |
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
496 header = INDEX_HEADER.unpack(entry_data[:4])[0] |
47183
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
497 self._initempty = False |
a13f72b9ccfb
revlog: move index reading logic in a dedicated method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47182
diff
changeset
|
498 else: |
47185
729668105901
revlog: rename `newversionflags` to `new_header`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47184
diff
changeset
|
499 header = new_header |
47184
6e0ee1810fbd
revlog: rename `versionflags` to header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47183
diff
changeset
|
500 |
47188
58ef549ae55f
revlog: directly use self._format_flags when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47187
diff
changeset
|
501 self._format_flags = header & ~0xFFFF |
47187
ef7a8a1622ad
revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
502 self._format_version = header & 0xFFFF |
ef7a8a1622ad
revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
503 |
47241
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
504 supported_flags = SUPPORTED_FLAGS.get(self._format_version) |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
505 if supported_flags is None: |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
506 msg = _(b'unknown version (%d) in revlog %s') |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
507 msg %= (self._format_version, self.display_id) |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
508 raise error.RevlogError(msg) |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
509 elif self._format_flags & ~supported_flags: |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
510 msg = _(b'unknown flags (%#04x) in version %d revlog %s') |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
511 display_flag = self._format_flags >> 16 |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
512 msg %= (display_flag, self._format_version, self.display_id) |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
513 raise error.RevlogError(msg) |
0e9105bf54cb
revlog: unify checks for supported flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
514 |
47242
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
515 features = FEATURES_BY_VERSION[self._format_version] |
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
516 self._inline = features[b'inline'](self._format_flags) |
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
517 self._generaldelta = features[b'generaldelta'](self._format_flags) |
4d1c893b9095
revlog: unify flag processing when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
518 self.hassidedata = features[b'sidedata'] |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
519 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
520 if not features[b'docket']: |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
521 self._indexfile = entry_point |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
522 index_data = entry_data |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
523 else: |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
524 self._docket_file = entry_point |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
525 if self._initempty: |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
526 self._docket = docketutil.default_docket(self, header) |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
527 else: |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
528 self._docket = docketutil.parse_docket(self, entry_data) |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
529 self._indexfile = self._docket.index_filepath() |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
530 index_data = b'' |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
531 index_size = self._docket.index_end |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
532 if index_size > 0: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
533 index_data = self._get_data( |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
534 self._indexfile, mmapindexthreshold, size=index_size |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
535 ) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
536 if len(index_data) < index_size: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
537 msg = _(b'too few index data for %s: got %d, expected %d') |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
538 msg %= (self.display_id, len(index_data), index_size) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
539 raise error.RevlogError(msg) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
540 |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
541 self._inline = False |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
542 # generaldelta implied by version 2 revlogs. |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
543 self._generaldelta = True |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
544 # the logic for persistent nodemap will be dealt with within the |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
545 # main docket, so disable it for now. |
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
546 self._nodemap_file = None |
47189
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
547 |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
548 if self.postfix is None or self.postfix == b'a': |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
549 self._datafile = b'%s.d' % self.radix |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
550 else: |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
551 self._datafile = b'%s.d.%s' % (self.radix, self.postfix) |
21ef5f75edf0
revlog: use "entry_point" phrasing for loading the revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47188
diff
changeset
|
552 |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
553 self.nodeconstants = sha1nodeconstants |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
554 self.nullid = self.nodeconstants.nullid |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46792
diff
changeset
|
555 |
41312
189e06b2d719
revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents:
41310
diff
changeset
|
556 # 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:
41310
diff
changeset
|
557 if not self._generaldelta: |
189e06b2d719
revlog: make sure we never use sparserevlog without general delta (issue6056)
Boris Feld <boris.feld@octobus.net>
parents:
41310
diff
changeset
|
558 self._sparserevlog = False |
4985
e6525e459157
revlog: simplify revlog.__init__
Matt Mackall <mpm@selenic.com>
parents:
4984
diff
changeset
|
559 |
39260
0a5b20c107a6
repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39259
diff
changeset
|
560 self._storedeltachains = True |
30154
5e72129d75ed
revlog: add instance variable controlling delta chain use
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30014
diff
changeset
|
561 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
562 devel_nodemap = ( |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
563 self._nodemap_file |
47158
b6e1fe7ac24b
revlog: split the option initialisation in its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
564 and force_nodemap |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
565 and parse_index_v1_nodemap is not None |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
566 ) |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
567 |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
568 use_rust_index = False |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
569 if rustrevlog is not None: |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
570 if self._nodemap_file is not None: |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
571 use_rust_index = True |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
572 else: |
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
573 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:
44511
diff
changeset
|
574 |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
575 self._parse_index = parse_index_v1 |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
576 if self._format_version == REVLOGV0: |
47079
724db234b790
revlog: code for `revlogv0` in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
577 self._parse_index = revlogv0.parse_index_v0 |
47187
ef7a8a1622ad
revlog: directly use self._format_version when loading index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
578 elif self._format_version == REVLOGV2: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
579 self._parse_index = parse_index_v2 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44353
diff
changeset
|
580 elif devel_nodemap: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
581 self._parse_index = parse_index_v1_nodemap |
44523
e7fff9c3cdac
rust-nodemap: automatically use the rust index for persistent nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44511
diff
changeset
|
582 elif use_rust_index: |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
583 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
|
584 try: |
47190
8b549ea4bebf
revlog: rename `indexdata` to entry_data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47189
diff
changeset
|
585 d = self._parse_index(index_data, self._inline) |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
586 index, _chunkcache = d |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
587 use_nodemap = ( |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
588 not self._inline |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
589 and self._nodemap_file is not None |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
590 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:
44356
diff
changeset
|
591 ) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
592 if use_nodemap: |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
593 nodemap_data = nodemaputil.persisted_data(self) |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
594 if nodemap_data is not None: |
44525
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
595 docket = nodemap_data[0] |
44803
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
596 if ( |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
597 len(d[0]) > docket.tip_rev |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
598 and d[0][docket.tip_rev][7] == docket.tip_node |
affe0fb42250
nodemap: fix validity checking when revlog is too short
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44526
diff
changeset
|
599 ): |
44525
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
600 # no changelog tampering |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
601 self._nodemap_docket = docket |
6c906eaedd0d
nodemap: track the tip_node for validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44523
diff
changeset
|
602 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
|
603 except (ValueError, IndexError): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
604 raise error.RevlogError( |
47172
e1936ae27897
revlog: use revlog.display_id for corruption error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47171
diff
changeset
|
605 _(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
|
606 ) |
43574
e258ad110488
revlog: no longer return the nodemap after parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43573
diff
changeset
|
607 self.index, self._chunkcache = d |
13265
04b302ce2781
revlog: always add the magic nullid/nullrev entry in parseindex
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13264
diff
changeset
|
608 if not self._chunkcache: |
04b302ce2781
revlog: always add the magic nullid/nullrev entry in parseindex
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13264
diff
changeset
|
609 self._chunkclear() |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
610 # revnum -> (chain-length, sum-delta-length) |
45802
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
611 self._chaininfocache = util.lrucachedict(500) |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
612 # revlog header -> revlog compressor |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
613 self._decompressors = {} |
116
e484cd5ec282
Only use lazy indexing for big indices and avoid the overhead of the
mpm@selenic.com
parents:
115
diff
changeset
|
614 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
615 @util.propertycache |
47090
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
616 def revlog_kind(self): |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
617 return self.target[0] |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
618 |
64cd1496bb70
revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47089
diff
changeset
|
619 @util.propertycache |
47167
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
620 def display_id(self): |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
621 """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:
47165
diff
changeset
|
622 # 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:
47165
diff
changeset
|
623 # revlog.target instead of using `self.radix` |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
624 return self.radix |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
625 |
fbf38517d17d
revlog: introduce a `display_id` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47165
diff
changeset
|
626 @util.propertycache |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
627 def _compressor(self): |
42043
1fac9b931d46
compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41877
diff
changeset
|
628 engine = util.compengines[self._compengine] |
1fac9b931d46
compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41877
diff
changeset
|
629 return engine.revlogcompressor(self._compengineopts) |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
630 |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
631 def _indexfp(self): |
36007
91b3b11565e5
revlog: move index file opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
36006
diff
changeset
|
632 """file object for the revlog's index file""" |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
633 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:
47229
diff
changeset
|
634 |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
635 def __index_write_fp(self): |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
636 # 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:
47229
diff
changeset
|
637 try: |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
638 f = self.opener( |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
639 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:
47229
diff
changeset
|
640 ) |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
641 if self._docket is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
642 f.seek(0, os.SEEK_END) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
643 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
644 f.seek(self._docket.index_end, os.SEEK_SET) |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
645 return f |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
646 except IOError as inst: |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
647 if inst.errno != errno.ENOENT: |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
648 raise |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
649 return self.opener( |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
650 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:
47229
diff
changeset
|
651 ) |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
652 |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
653 def __index_new_fp(self): |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
654 # 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:
47229
diff
changeset
|
655 return self.opener( |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
656 self._indexfile, |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
657 mode=b"w", |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
658 checkambig=self._checkambig, |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
659 atomictemp=True, |
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
660 ) |
36007
91b3b11565e5
revlog: move index file opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
36006
diff
changeset
|
661 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
662 def _datafp(self, mode=b'r'): |
36006
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35885
diff
changeset
|
663 """file object for the revlog's data file""" |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
664 return self.opener(self._datafile, mode=mode) |
36006
61326dd7cb8d
revlog: move datafile opening in a method
Boris Feld <boris.feld@octobus.net>
parents:
35885
diff
changeset
|
665 |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
666 @contextlib.contextmanager |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
667 def _datareadfp(self, existingfp=None): |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
668 """file object suitable to read data""" |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
669 # Use explicit file handle, if given. |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
670 if existingfp is not None: |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
671 yield existingfp |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
672 |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
673 # Use a file handle being actively used for writes, if available. |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
674 # There is some danger to doing this because reads will seek the |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
675 # file. However, _writeentry() performs a SEEK_END before all writes, |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
676 # so we should be safe. |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
677 elif self._writinghandles: |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
678 if self._inline: |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
679 yield self._writinghandles[0] |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
680 else: |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
681 yield self._writinghandles[1] |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
682 |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
683 # Otherwise open a new file handle. |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
684 else: |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
685 if self._inline: |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
686 func = self._indexfp |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
687 else: |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
688 func = self._datafp |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
689 with func() as fp: |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
690 yield fp |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
691 |
43492
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
692 def tiprev(self): |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
693 return len(self.index) - 1 |
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
694 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
695 def tip(self): |
43492
ec7ba79bf3db
revlog: move tiprev() from changelog up to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
43133
diff
changeset
|
696 return self.node(self.tiprev()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
697 |
24030
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
698 def __contains__(self, rev): |
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23857
diff
changeset
|
699 return 0 <= rev < len(self) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
700 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
701 def __len__(self): |
38890
781b2720d2ac
index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38889
diff
changeset
|
702 return len(self.index) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
703 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
704 def __iter__(self): |
38823
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38818
diff
changeset
|
705 return iter(pycompat.xrange(len(self))) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
706 |
17672
474047947b8f
clfilter: make the revlog class responsible of all its iteration
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17537
diff
changeset
|
707 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
|
708 """iterate over all rev in this revlog (from start to stop)""" |
39886
d63153611ed5
storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39884
diff
changeset
|
709 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
|
710 |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43621
diff
changeset
|
711 @property |
13275
68da048b4c88
revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents:
13268
diff
changeset
|
712 def nodemap(self): |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43621
diff
changeset
|
713 msg = ( |
43663
c207c46a86b9
py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43628
diff
changeset
|
714 b"revlog.nodemap is deprecated, " |
c207c46a86b9
py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43628
diff
changeset
|
715 b"use revlog.index.[has_node|rev|get_rev]" |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43621
diff
changeset
|
716 ) |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43621
diff
changeset
|
717 util.nouideprecwarn(msg, b'5.3', stacklevel=2) |
43576
90a0f631829e
revlog: return the nodemap as the nodecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43574
diff
changeset
|
718 return self.index.nodemap |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
719 |
43578
6e3e3e5446ba
revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43577
diff
changeset
|
720 @property |
6e3e3e5446ba
revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43577
diff
changeset
|
721 def _nodecache(self): |
43663
c207c46a86b9
py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43628
diff
changeset
|
722 msg = b"revlog._nodecache is deprecated, use revlog.index.nodemap" |
43578
6e3e3e5446ba
revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43577
diff
changeset
|
723 util.nouideprecwarn(msg, b'5.3', stacklevel=2) |
6e3e3e5446ba
revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43577
diff
changeset
|
724 return self.index.nodemap |
6e3e3e5446ba
revlog: deprecate the _nodecache attribute (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43577
diff
changeset
|
725 |
16374
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
726 def hasnode(self, node): |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
727 try: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
728 self.rev(node) |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
729 return True |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
730 except KeyError: |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
731 return False |
29c2ff719715
revlog: add hasnode helper method
Matt Mackall <mpm@selenic.com>
parents:
15890
diff
changeset
|
732 |
35839
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
733 def candelta(self, baserev, rev): |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
734 """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
|
735 # 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
|
736 # 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
|
737 # 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
|
738 # 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
|
739 # rawtext contents) and the delta could be incompatible. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
740 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
741 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
742 ): |
35839
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
743 return False |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
744 return True |
d031609b3cb7
changegroup: do not delta lfs revisions
Jun Wu <quark@fb.com>
parents:
35738
diff
changeset
|
745 |
44465
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
746 def update_caches(self, transaction): |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
747 if self._nodemap_file is not None: |
44465
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
748 if transaction is None: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
749 nodemaputil.update_persistent_nodemap(self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
750 else: |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
751 nodemaputil.setup_persistent_nodemap(transaction, self) |
336ec75ed1ac
nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44397
diff
changeset
|
752 |
16414
e8d37b78acfb
parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents:
16375
diff
changeset
|
753 def clearcaches(self): |
40053
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
754 self._revisioncache = None |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
755 self._chainbasecache.clear() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
756 self._chunkcache = (0, b'') |
27465
072a675c51f2
revlog: make clearcaches() more effective
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27449
diff
changeset
|
757 self._pcache = {} |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
758 self._nodemap_docket = None |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
759 self.index.clearcaches() |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
760 # The python code is the one responsible for validating the docket, we |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
761 # end up having to refresh it here. |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
762 use_nodemap = ( |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
763 not self._inline |
47178
04f2f94836a5
revlog: rename `nodemap_file` to `_nodemap_file`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47177
diff
changeset
|
764 and self._nodemap_file is not None |
44511
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
765 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:
44503
diff
changeset
|
766 ) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
767 if use_nodemap: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
768 nodemap_data = nodemaputil.persisted_data(self) |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
769 if nodemap_data is not None: |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
770 self._nodemap_docket = nodemap_data[0] |
87b327de772c
nodemap: refresh the persistent data on nodemap creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44503
diff
changeset
|
771 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
|
772 |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
773 def rev(self, node): |
13275
68da048b4c88
revlog: incrementally build node cache with linear searches
Matt Mackall <mpm@selenic.com>
parents:
13268
diff
changeset
|
774 try: |
43601
2da51e292734
index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
775 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
|
776 except TypeError: |
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
21752
diff
changeset
|
777 raise |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
778 except error.RevlogError: |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
779 # parsers.c radix tree lookup failed |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
780 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
781 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
782 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
783 ): |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43572
diff
changeset
|
784 raise error.WdirUnsupported |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
785 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
|
786 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
787 # Accessors for index entries. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
788 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
789 # 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
|
790 # are flags. |
2072 | 791 def start(self, rev): |
5006
c2febf5420e9
revlog: minor chunk speed-up
Matt Mackall <mpm@selenic.com>
parents:
5005
diff
changeset
|
792 return int(self.index[rev][0] >> 16) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
793 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
794 def flags(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
795 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
|
796 |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
797 def length(self, rev): |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
798 return self.index[rev][1] |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
799 |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
800 def sidedata_length(self, rev): |
47150
84b176ad2860
revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
801 if not self.hassidedata: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
802 return 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
803 return self.index[rev][9] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
804 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
805 def rawsize(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
806 """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
|
807 l = self.index[rev][2] |
38210
7fa3408f83ef
revlog: disallow setting uncompressed length to None
Yuya Nishihara <yuya@tcha.org>
parents:
38202
diff
changeset
|
808 if l >= 0: |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
809 return l |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
810 |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
811 t = self.rawdata(rev) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
812 return len(t) |
31856
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
813 |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
814 def size(self, rev): |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
815 """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
|
816 # 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
|
817 # 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
|
818 flags = self.flags(rev) |
42747
92ac6b1697a7
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42746
diff
changeset
|
819 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
|
820 return self.rawsize(rev) |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
821 |
0ab7f469d386
revlog: make "size" diverge from "rawsize"
Jun Wu <quark@fb.com>
parents:
31804
diff
changeset
|
822 return len(self.revision(rev, raw=False)) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
823 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
824 def chainbase(self, rev): |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
825 base = self._chainbasecache.get(rev) |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
826 if base is not None: |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
827 return base |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
828 |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
829 index = self.index |
38202
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
830 iterrev = rev |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
831 base = index[iterrev][3] |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
832 while base != iterrev: |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
833 iterrev = base |
fc72beec2a1a
revlog: make chainbase cache its result for the correct revision
Paul Morelle <paul.morelle@octobus.net>
parents:
38201
diff
changeset
|
834 base = index[iterrev][3] |
29841
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
835 |
92ac2baaea86
revlog: use an LRU cache for delta chain bases
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29840
diff
changeset
|
836 self._chainbasecache[rev] = base |
14252
19067884c5f5
revlog: calculate base revisions iteratively
Sune Foldager <cryo@cyanite.org>
parents:
14251
diff
changeset
|
837 return base |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
838 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
839 def linkrev(self, rev): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
840 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
|
841 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
842 def parentrevs(self, rev): |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
843 try: |
35525
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35354
diff
changeset
|
844 entry = self.index[rev] |
32441
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
845 except IndexError: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
846 if rev == wdirrev: |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
847 raise error.WdirUnsupported |
a28c76e1cea9
revlog: raise WdirUnsupported when wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32431
diff
changeset
|
848 raise |
46792
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
849 if entry[5] == nullrev: |
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
850 return entry[6], entry[5] |
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
851 else: |
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
852 return entry[5], entry[6] |
35525
a0fab647a8f1
revlog: don't use slicing to return parents
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35354
diff
changeset
|
853 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
854 # fast parentrevs(rev) where rev isn't filtered |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
855 _uncheckedparentrevs = parentrevs |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
856 |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
857 def node(self, rev): |
32481
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
858 try: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
859 return self.index[rev][7] |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
860 except IndexError: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
861 if rev == wdirrev: |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
862 raise error.WdirUnsupported |
34e9b8b94f66
revlog: raise error.WdirUnsupported from revlog.node() if wdirrev is passed
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32441
diff
changeset
|
863 raise |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
864 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
865 # Derived from index values. |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
866 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
867 def end(self, rev): |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
868 return self.start(rev) + self.length(rev) |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
869 |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
870 def parents(self, node): |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
871 i = self.index |
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
872 d = i[self.rev(node)] |
46792
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
873 # inline node() to avoid function call overhead |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
874 if d[5] == self.nullid: |
46792
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
875 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:
46731
diff
changeset
|
876 else: |
49fd21f32695
revlog: guarantee that p1 != null if a non-null parent exists
Joerg Sonnenberger <joerg@bec.de>
parents:
46731
diff
changeset
|
877 return i[d[5]][7], i[d[6]][7] |
30301
0986f225c149
revlog: reorder index accessors to match data structure order
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30210
diff
changeset
|
878 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
879 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
|
880 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
|
881 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
882 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
|
883 chaininfocache = self._chaininfocache |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
884 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
|
885 return chaininfocache[rev] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
886 index = self.index |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
887 generaldelta = self._generaldelta |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
888 iterrev = rev |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
889 e = index[iterrev] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
890 clen = 0 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
891 compresseddeltalen = 0 |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
892 while iterrev != e[3]: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
893 clen += 1 |
23286
40e0067899d4
revlog: compute length of compressed deltas along with chain length
Siddharth Agarwal <sid0@fb.com>
parents:
23285
diff
changeset
|
894 compresseddeltalen += e[1] |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
895 if generaldelta: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
896 iterrev = e[3] |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
897 else: |
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
898 iterrev -= 1 |
23306
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
899 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
|
900 t = chaininfocache[iterrev] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
901 clen += t[0] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
902 compresseddeltalen += t[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
903 break |
23254
d23834b871ac
debugrevlog: fix computing chain length in debugrevlog -d
Mateusz Kwapich <mitrandir@fb.com>
parents:
22934
diff
changeset
|
904 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
|
905 else: |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
906 # 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
|
907 # 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
|
908 compresseddeltalen += e[1] |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
909 r = (clen, compresseddeltalen) |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
910 chaininfocache[rev] = r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
911 return r |
f7a42f8e82bd
revlog: cache chain info after calculating it for a rev (issue4452)
Siddharth Agarwal <sid0@fb.com>
parents:
23288
diff
changeset
|
912 |
27468
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
913 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
|
914 """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
|
915 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
916 ``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
|
917 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
|
918 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
919 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
|
920 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
|
921 ``stoprev`` was hit. |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
922 """ |
33173
6d678ab1b10d
revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32987
diff
changeset
|
923 # Try C implementation. |
6d678ab1b10d
revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32987
diff
changeset
|
924 try: |
6d678ab1b10d
revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32987
diff
changeset
|
925 return self.index.deltachain(rev, stoprev, self._generaldelta) |
6d678ab1b10d
revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32987
diff
changeset
|
926 except AttributeError: |
6d678ab1b10d
revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32987
diff
changeset
|
927 pass |
6d678ab1b10d
revlog: C implementation of delta chain resolution
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32987
diff
changeset
|
928 |
27468
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
929 chain = [] |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
930 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
931 # 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
|
932 index = self.index |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
933 generaldelta = self._generaldelta |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
934 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
935 iterrev = rev |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
936 e = index[iterrev] |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
937 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
|
938 chain.append(iterrev) |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
939 if generaldelta: |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
940 iterrev = e[3] |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
941 else: |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
942 iterrev -= 1 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
943 e = index[iterrev] |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
944 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
945 if iterrev == stoprev: |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
946 stopped = True |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
947 else: |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
948 chain.append(iterrev) |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
949 stopped = False |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
950 |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
951 chain.reverse() |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
952 return chain, stopped |
93ac15f03331
revlog: refactor delta chain computation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27465
diff
changeset
|
953 |
18081
f88c60e740a1
revlog.ancestors: add support for including revs
Siddharth Agarwal <sid0@fb.com>
parents:
17975
diff
changeset
|
954 def ancestors(self, revs, stoprev=0, inclusive=False): |
40772
8947f49daaa8
revlog: update the docstring of `ancestors` to match reality
Boris Feld <boris.feld@octobus.net>
parents:
40671
diff
changeset
|
955 """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
|
956 Does not generate revs lower than stoprev. |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
957 |
18090
9abc55ef85b5
revlog: move ancestor generation out to a new class
Siddharth Agarwal <sid0@fb.com>
parents:
18083
diff
changeset
|
958 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
|
959 |
40152
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
960 # first, make sure start revisions aren't filtered |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
961 revs = list(revs) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
962 checkrev = self.node |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
963 for r in revs: |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
964 checkrev(r) |
adbf8ca239e4
revlog: optimize ancestors() to not check filtered revisions for each
Yuya Nishihara <yuya@tcha.org>
parents:
40057
diff
changeset
|
965 # and we're sure ancestors aren't filtered as well |
41118
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
966 |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
967 if rustancestor is not None: |
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
968 lazyancestors = rustancestor.LazyAncestors |
41118
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
969 arg = self.index |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
970 else: |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
971 lazyancestors = ancestor.lazyancestors |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
972 arg = self._uncheckedparentrevs |
536c83535cbd
rust-cpython: using the new bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
41089
diff
changeset
|
973 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
|
974 |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16866
diff
changeset
|
975 def descendants(self, revs): |
40000
0b24fcd88066
dagop: extract descendants() from revlog module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39913
diff
changeset
|
976 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
|
977 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
978 def findcommonmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
979 """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
|
980 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
|
981 tuple: |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
982 |
15835
fa15869bf95c
revlog: improve docstring for findcommonmissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15827
diff
changeset
|
983 ::common, (::heads) - (::common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
984 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
985 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
|
986 topologically sorted. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
987 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
988 '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
|
989 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
|
990 supplied, uses nullid.""" |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
991 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
992 common = [self.nullid] |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
993 if heads is None: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
994 heads = self.heads() |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
995 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
996 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
|
997 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
|
998 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
999 # we want the ancestors, but inclusive |
20073
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1000 class lazyset(object): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1001 def __init__(self, lazyvalues): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1002 self.addedvalues = set() |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1003 self.lazyvalues = lazyvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1004 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1005 def __contains__(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1006 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
|
1007 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1008 def __iter__(self): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1009 added = self.addedvalues |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1010 for r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1011 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1012 for r in self.lazyvalues: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1013 if not r in added: |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1014 yield r |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1015 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1016 def add(self, value): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1017 self.addedvalues.add(value) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1018 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1019 def update(self, values): |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1020 self.addedvalues.update(values) |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1021 |
eeba4eaf0716
revlog: return lazy set from findcommonmissing
Durham Goode <durham@fb.com>
parents:
19776
diff
changeset
|
1022 has = lazyset(self.ancestors(common)) |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
1023 has.add(nullrev) |
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
1024 has.update(common) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1025 |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1026 # 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
|
1027 missing = set() |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24454
diff
changeset
|
1028 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
|
1029 while visit: |
16803
107a3270a24a
cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents:
16786
diff
changeset
|
1030 r = visit.popleft() |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1031 if r in missing: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1032 continue |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1033 else: |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
1034 missing.add(r) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1035 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
|
1036 if p not in has: |
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1037 visit.append(p) |
8453
d1ca637b0773
revlog.missing(): use sets instead of a dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8391
diff
changeset
|
1038 missing = list(missing) |
7233
9f0e52e1df77
fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7109
diff
changeset
|
1039 missing.sort() |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
1040 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
|
1041 |
23337
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1042 def incrementalmissingrevs(self, common=None): |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1043 """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
|
1044 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
|
1045 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
|
1046 object. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1047 |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1048 '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
|
1049 nullrev. |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1050 """ |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1051 if common is None: |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1052 common = [nullrev] |
3a8a763f4197
revlog: add a method to get missing revs incrementally
Siddharth Agarwal <sid0@fb.com>
parents:
23328
diff
changeset
|
1053 |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
1054 if rustancestor is not None: |
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
1055 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
|
1056 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
|
1057 |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1058 def findmissingrevs(self, common=None, heads=None): |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1059 """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
|
1060 are not ancestors of common. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1061 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1062 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
|
1063 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
|
1064 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1065 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
|
1066 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
|
1067 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1068 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
|
1069 topologically sorted. |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1070 |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1071 '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
|
1072 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
|
1073 supplied, uses nullid.""" |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1074 if common is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1075 common = [nullrev] |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1076 if heads is None: |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1077 heads = self.headrevs() |
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1078 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
1079 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
1080 return inc.missingancestors(heads) |
17972
7ef00d09ef35
revlog: add rev-specific variant of findmissing
Siddharth Agarwal <sid0@fb.com>
parents:
17971
diff
changeset
|
1081 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1082 def findmissing(self, common=None, heads=None): |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1083 """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
|
1084 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1085 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
|
1086 satisfies the following constraints: |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1087 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1088 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
|
1089 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
|
1090 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1091 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
|
1092 topologically sorted. |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1093 |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13400
diff
changeset
|
1094 '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
|
1095 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
|
1096 supplied, uses nullid.""" |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
1097 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1098 common = [self.nullid] |
17971
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
1099 if heads is None: |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
1100 heads = self.heads() |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
1101 |
e1b9a78a7aed
revlog: switch findmissing to use ancestor.missingancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17951
diff
changeset
|
1102 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
|
1103 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
|
1104 |
23338
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
1105 inc = self.incrementalmissingrevs(common=common) |
d8f5b2f50f41
revlog: switch findmissing* methods to incrementalmissingrevs
Siddharth Agarwal <sid0@fb.com>
parents:
23337
diff
changeset
|
1106 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
|
1107 |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1108 def nodesbetween(self, roots=None, heads=None): |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1109 """Return a topological path from 'roots' to 'heads'. |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1110 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1111 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
|
1112 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
|
1113 these constraints: |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1114 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1115 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
|
1116 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
|
1117 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1118 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
|
1119 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
|
1120 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
|
1121 |
10047
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1122 '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
|
1123 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
|
1124 '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
|
1125 |
27267b1f68b4
revlog: rewrite several method docstrings
Greg Ward <greg-hg@gerg.ca>
parents:
9679
diff
changeset
|
1126 '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
|
1127 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
|
1128 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
|
1129 nonodes = ([], [], []) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1130 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
|
1131 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
|
1132 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
|
1133 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1134 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
|
1135 else: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1136 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
|
1137 lowestrev = nullrev |
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3508
diff
changeset
|
1138 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
|
1139 # We want _all_ the nodes! |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1140 return ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1141 [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
|
1142 [self.nullid], |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1143 list(self.heads()), |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1144 ) |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1145 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
|
1146 # 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
|
1147 # node. |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1148 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
|
1149 # 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
|
1150 ancestors = None |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1151 # 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
|
1152 heads = {} |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1153 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
|
1154 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
|
1155 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
|
1156 return nonodes |
8464
7af92e70bb25
revlog: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8453
diff
changeset
|
1157 ancestors = set() |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1158 # 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
|
1159 # 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
|
1160 # find from roots. |
14219
c33427080671
revlog: use real Booleans instead of 0/1 in nodesbetween
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
1161 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
|
1162 # 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
|
1163 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
|
1164 # 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
|
1165 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
|
1166 while nodestotag: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1167 # 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
|
1168 n = nodestotag.pop() |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1169 # Never tag nullid |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1170 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
|
1171 continue |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1172 # 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
|
1173 # 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
|
1174 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
|
1175 if r >= lowestrev: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1176 if n not in ancestors: |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1177 # 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
|
1178 # 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
|
1179 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
|
1180 # 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
|
1181 nodestotag.update( |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1182 [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
|
1183 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1184 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
|
1185 # 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
|
1186 # any other heads. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1187 heads.pop(n) |
1459
106fdec8e1fb
Fix small bug in nodesbetween if heads is [nullid].
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1188 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
|
1189 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1190 # 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
|
1191 # 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
|
1192 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1193 # 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
|
1194 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
|
1195 # 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
|
1196 # 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
|
1197 |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1198 # Filter out roots that aren't ancestors of heads |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
1199 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
|
1200 # 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
|
1201 if roots: |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
1202 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
|
1203 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1204 # 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
|
1205 return nonodes |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1206 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1207 # 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
|
1208 # 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
|
1209 lowestrev = nullrev |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1210 roots = [self.nullid] |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8150
diff
changeset
|
1211 # Transform our roots list into a set. |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1212 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
|
1213 # 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
|
1214 # '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
|
1215 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
|
1216 # 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
|
1217 orderedout = [] |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1218 # Don't start at nullid since we don't want nullid in our output list, |
17483 | 1219 # 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
|
1220 # 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
|
1221 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
|
1222 n = self.node(r) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1223 isdescendant = False |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1224 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
|
1225 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1226 elif n in descendants: |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1227 # n is already a descendant |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1228 isdescendant = True |
1457
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1229 # 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
|
1230 # 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
|
1231 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
|
1232 # 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
|
1233 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1234 # 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
|
1235 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
|
1236 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
|
1237 else: |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1238 p = tuple(self.parents(n)) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1239 # 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
|
1240 # 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
|
1241 # up there, remember?) |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1242 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
|
1243 descendants.add(n) |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1244 isdescendant = True |
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14523
diff
changeset
|
1245 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
|
1246 # 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
|
1247 orderedout.append(n) |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1248 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
|
1249 # 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
|
1250 # from roots. |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1251 # 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
|
1252 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
|
1253 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
|
1254 # 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
|
1255 # 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
|
1256 # 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
|
1257 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
|
1258 # 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
|
1259 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
|
1260 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
|
1261 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
|
1262 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
|
1263 assert orderedout |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1264 assert roots |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1265 assert heads |
518da3c3b6ce
This implements the nodesbetween method, and it removes the newer method
Eric Hopper <hopper@omnifarious.org>
parents:
1351
diff
changeset
|
1266 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
|
1267 |
41275
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
1268 def headrevs(self, revs=None): |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
1269 if revs is None: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
1270 try: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
1271 return self.index.headrevs() |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
1272 except AttributeError: |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41247
diff
changeset
|
1273 return self._headrevs() |
42468
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
1274 if rustdagop is not None: |
a3a8887e4426
rust: using policy.importrust from Python callers
Georges Racinet <georges.racinet@octobus.net>
parents:
42462
diff
changeset
|
1275 return rustdagop.headrevs(self.index, revs) |
41772
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41700
diff
changeset
|
1276 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
|
1277 |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
1278 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
|
1279 return self.index.computephasesmapsets(roots) |
24444
27e3ba73fbb1
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com>
parents:
24255
diff
changeset
|
1280 |
17674
e69274f8d444
clfilter: split `revlog.headrevs` C call from python code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17673
diff
changeset
|
1281 def _headrevs(self): |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
1282 count = len(self) |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
1283 if not count: |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
1284 return [nullrev] |
17673
d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17672
diff
changeset
|
1285 # 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
|
1286 ishead = [0] * (count + 1) |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
1287 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
|
1288 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
|
1289 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
|
1290 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
|
1291 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
|
1292 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
|
1293 |
3923
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3755
diff
changeset
|
1294 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
|
1295 """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
|
1296 |
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
1297 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
|
1298 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
|
1299 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
|
1300 as if they had no children |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
1301 """ |
4991
9c8c42bcf17a
revlog: implement a fast path for heads
Matt Mackall <mpm@selenic.com>
parents:
4990
diff
changeset
|
1302 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
|
1303 if not len(self): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1304 return [self.nullid] |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14144
diff
changeset
|
1305 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
|
1306 |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
1307 if start is None: |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1308 start = nullrev |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1309 else: |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1310 start = self.rev(start) |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1311 |
44470
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44465
diff
changeset
|
1312 stoprevs = {self.rev(n) for n in stop or []} |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1313 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1314 revs = dagop.headrevssubset( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1315 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1316 ) |
40001
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1317 |
8af835af0a85
dagop: extract DAG local heads functionality from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40000
diff
changeset
|
1318 return [self.node(rev) for rev in revs] |
370 | 1319 |
1320 def children(self, node): | |
1083 | 1321 """find the children of a given node""" |
370 | 1322 c = [] |
1323 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
|
1324 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
|
1325 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
|
1326 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
|
1327 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
|
1328 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
|
1329 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
|
1330 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
|
1331 c.append(self.node(r)) |
370 | 1332 return c |
515 | 1333 |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
1334 def commonancestorsheads(self, a, b): |
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
1335 """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
|
1336 a, b = self.rev(a), self.rev(b) |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1337 ancs = self._commonancestorsheads(a, b) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1338 return pycompat.maplist(self.node, ancs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1339 |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1340 def _commonancestorsheads(self, *revs): |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1341 """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
|
1342 try: |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1343 ancs = self.index.commonancestorsheads(*revs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1344 except (AttributeError, OverflowError): # C implementation failed |
38516
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1345 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs) |
99f864b34451
revlog: refactor out the rev-oriented part of commonancestorheads
Boris Feld <boris.feld@octobus.net>
parents:
38515
diff
changeset
|
1346 return ancs |
21104
40ace21cb3a1
revlog: introduce commonancestorsheads method
Mads Kiilerich <madski@unity3d.com>
parents:
20965
diff
changeset
|
1347 |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
1348 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
|
1349 """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
|
1350 |
160da69ba1bf
revlog: replace descendant(b, a) by isdescendantrev(a, b) (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38663
diff
changeset
|
1351 A revision is considered an ancestor of itself.""" |
38518
cc3543c87de5
revlog: reuse 'descendant' implemention in 'isancestor'
Boris Feld <boris.feld@octobus.net>
parents:
38517
diff
changeset
|
1352 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
|
1353 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
|
1354 |
a06b2b032557
revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38665
diff
changeset
|
1355 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
|
1356 """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
|
1357 |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1358 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
|
1359 |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1360 The implementation of this is trivial but the use of |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1361 reachableroots is not.""" |
38668
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1362 if a == nullrev: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1363 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1364 elif a == b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1365 return True |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1366 elif a > b: |
21846c94e605
revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38666
diff
changeset
|
1367 return False |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1368 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
|
1369 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1370 def reachableroots(self, minroot, heads, roots, includepath=False): |
43799
2e30d7df4809
revlog: fix revset in reachableroots docstring
Jun Wu <quark@fb.com>
parents:
43663
diff
changeset
|
1371 """return (heads(::(<roots> and <roots>::<heads>))) |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1372 |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1373 If includepath is True, return (<roots>::<heads>).""" |
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1374 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1375 return self.index.reachableroots2( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1376 minroot, heads, roots, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1377 ) |
42462
055c3e2c44f0
revlog: speed up isancestor
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
42044
diff
changeset
|
1378 except AttributeError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1379 return dagop._reachablerootspure( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1380 self.parentrevs, minroot, roots, heads, includepath |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1381 ) |
22381
392ae5cb8d62
revlog: introduce isancestor method for efficiently determining node lineage
Mads Kiilerich <madski@unity3d.com>
parents:
22282
diff
changeset
|
1382 |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
1383 def ancestor(self, a, b): |
22389
94f77624dbb5
comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents:
22381
diff
changeset
|
1384 """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
|
1385 |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
1386 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
|
1387 try: |
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
1388 ancs = self.index.ancestors(a, b) |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
1389 except (AttributeError, OverflowError): |
18988
5bae936764bb
parsers: a C implementation of the new ancestors algorithm
Bryan O'Sullivan <bryano@fb.com>
parents:
18987
diff
changeset
|
1390 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
|
1391 if ancs: |
3605d4e7e618
revlog: choose a consistent ancestor when there's a tie
Bryan O'Sullivan <bryano@fb.com>
parents:
18986
diff
changeset
|
1392 # choose a consistent winner when there's a tie |
21107
4a6c8b6b10d3
revlog: backout 514d32de6646 - commonancestors
Mads Kiilerich <madski@unity3d.com>
parents:
21104
diff
changeset
|
1393 return min(map(self.node, ancs)) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1394 return self.nullid |
10897
adb6a291bbdb
revlog: put graph related functions together
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10404
diff
changeset
|
1395 |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1396 def _match(self, id): |
16762
93f8b9565257
revlog: don't handle long for revision matching
Matt Mackall <mpm@selenic.com>
parents:
16686
diff
changeset
|
1397 if isinstance(id, int): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
1398 # 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
|
1399 return self.node(id) |
47082
c5e1cc0b4c77
core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents:
47081
diff
changeset
|
1400 if len(id) == self.nodeconstants.nodelen: |
3438 | 1401 # possibly a binary node |
1402 # odds of a binary node being all hex in ASCII are 1 in 10**25 | |
1403 try: | |
1404 node = id | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1405 self.rev(node) # quick search the index |
3438 | 1406 return node |
39791
974592474dee
revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39790
diff
changeset
|
1407 except error.LookupError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1408 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
|
1409 try: |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
1410 # str(rev) |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
1411 rev = int(id) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1412 if b"%d" % rev != id: |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1413 raise ValueError |
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1414 if rev < 0: |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1415 rev = len(self) + rev |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
1416 if rev < 0 or rev >= len(self): |
4980
fc44c8df9d99
revlog: some codingstyle cleanups
Matt Mackall <mpm@selenic.com>
parents:
4979
diff
changeset
|
1417 raise ValueError |
36
da28286bf6b7
Add smart node lookup by substring or by rev number
mpm@selenic.com
parents:
26
diff
changeset
|
1418 return self.node(rev) |
469 | 1419 except (ValueError, OverflowError): |
3156
d01e4cb2f5f2
cleanups in revlog.lookup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3139
diff
changeset
|
1420 pass |
47081
a407fe56d6e8
core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents:
47079
diff
changeset
|
1421 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
|
1422 try: |
3438 | 1423 # a full hex nodeid? |
1424 node = bin(id) | |
7874
d812029cda85
cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7873
diff
changeset
|
1425 self.rev(node) |
3157
4fe41a9e4591
optimize revlog.lookup when passed hex(node)[:...]
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3156
diff
changeset
|
1426 return node |
39791
974592474dee
revlog: drop LookupError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39790
diff
changeset
|
1427 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
|
1428 pass |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1429 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1430 def _partialmatch(self, id): |
37449
a0d71618074f
revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents:
37443
diff
changeset
|
1431 # we don't care wdirfilenodeids as they should be always full hash |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1432 maybewdir = self.nodeconstants.wdirhex.startswith(id) |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
1433 try: |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
1434 partial = self.index.partialmatch(id) |
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
1435 if partial and self.hasnode(partial): |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1436 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1437 # single 'ff...' match in radix tree, ambiguous with wdir |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
1438 raise error.RevlogError |
30401
2ded17b64f09
revlog: avoid shadowing several variables using list comprehensions
Augie Fackler <augie@google.com>
parents:
30303
diff
changeset
|
1439 return partial |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1440 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1441 # no 'ff...' match in radix tree, wdir identified |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1442 raise error.WdirUnsupported |
19471
fd1bb7c1be78
revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents:
19326
diff
changeset
|
1443 return None |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
1444 except error.RevlogError: |
16665
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
1445 # 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
|
1446 # 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
|
1447 if not getattr(self, 'filteredrevs', None): |
39790
4a2466b2a434
revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39789
diff
changeset
|
1448 raise error.AmbiguousPrefixLookupError( |
47173
1ec64f59dc27
revlog: use revlog.display_id in ambiguity errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47172
diff
changeset
|
1449 id, self.display_id, _(b'ambiguous identifier') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1450 ) |
19471
fd1bb7c1be78
revlog: handle hidden revs in _partialmatch (issue3979)
Matt Mackall <mpm@selenic.com>
parents:
19326
diff
changeset
|
1451 # 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
|
1452 except (AttributeError, ValueError): |
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
1453 # 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
|
1454 pass |
e410be860393
revlog: speed up prefix matching against nodes
Bryan O'Sullivan <bryano@fb.com>
parents:
16533
diff
changeset
|
1455 |
13258
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
1456 if id in self._pcache: |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
1457 return self._pcache[id] |
c2661863f16f
revlog: introduce a cache for partial lookups
Matt Mackall <mpm@selenic.com>
parents:
13254
diff
changeset
|
1458 |
37819
ee3d58b4a47f
revlog: make pure version of _partialmatch() support 40-byte hex nodeids
Martin von Zweigbergk <martinvonz@google.com>
parents:
37767
diff
changeset
|
1459 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
|
1460 try: |
3438 | 1461 # hex(node)[:...] |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8658
diff
changeset
|
1462 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
|
1463 prefix = bin(id[: l * 2]) |
13259
3b616dfa4b17
revlog: do revlog node->rev mapping by scanning
Matt Mackall <mpm@selenic.com>
parents:
13258
diff
changeset
|
1464 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
|
1465 nl = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1466 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
|
1467 ] |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1468 if self.nodeconstants.nullhex.startswith(id): |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1469 nl.append(self.nullid) |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
1470 if len(nl) > 0: |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1471 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
|
1472 self._pcache[id] = nl[0] |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
1473 return nl[0] |
39790
4a2466b2a434
revlog: drop some more error aliases (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39789
diff
changeset
|
1474 raise error.AmbiguousPrefixLookupError( |
47173
1ec64f59dc27
revlog: use revlog.display_id in ambiguity errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47172
diff
changeset
|
1475 id, self.display_id, _(b'ambiguous identifier') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1476 ) |
32704
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1477 if maybewdir: |
af854b1b36f8
revlog: add support for partial matching of wdir node id
Yuya Nishihara <yuya@tcha.org>
parents:
32679
diff
changeset
|
1478 raise error.WdirUnsupported |
7365
ec3aafa84d44
lookup: speed up partial lookup
Matt Mackall <mpm@selenic.com>
parents:
7363
diff
changeset
|
1479 return None |
36275
f574cc00831a
node: make bin() be a wrapper instead of just an alias
Augie Fackler <augie@google.com>
parents:
36013
diff
changeset
|
1480 except TypeError: |
3453
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1481 pass |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1482 |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1483 def lookup(self, id): |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1484 """locate a node based on: |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
1485 - revision number or str(revision number) |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
1486 - 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
|
1487 """ |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1488 n = self._match(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1489 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
|
1490 return n |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1491 n = self._partialmatch(id) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1492 if n: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3438
diff
changeset
|
1493 return n |
515 | 1494 |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
1495 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
|
1496 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
1497 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
|
1498 """Find the shortest unambiguous prefix that matches node.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1499 |
37907
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
1500 def isvalid(prefix): |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1501 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
|
1502 matchednode = self._partialmatch(prefix) |
39836
7a9e2d85f475
revlog: catch more specific exception in shortest()
Yuya Nishihara <yuya@tcha.org>
parents:
39794
diff
changeset
|
1503 except error.AmbiguousPrefixLookupError: |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1504 return False |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1505 except error.WdirUnsupported: |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1506 # single 'ff...' match |
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1507 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
|
1508 if matchednode is None: |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
1509 raise error.LookupError(node, self.display_id, _(b'no node')) |
38014
76e933e0ccc9
shortest: remove unnecessary check for revnum in isvalid()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38013
diff
changeset
|
1510 return True |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1511 |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1512 def maybewdir(prefix): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1513 return all(c == b'f' for c in pycompat.iterbytestr(prefix)) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1514 |
37767
44d1959acb3b
revlog: make shortest() take a full binary nodeid (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37494
diff
changeset
|
1515 hexnode = hex(node) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1516 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1517 def disambiguate(hexnode, minlength): |
38015
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
38014
diff
changeset
|
1518 """Disambiguate against wdirid.""" |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
1519 for length in range(minlength, len(hexnode) + 1): |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1520 prefix = hexnode[:length] |
38015
3ac950cd5978
shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
38014
diff
changeset
|
1521 if not maybewdir(prefix): |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1522 return prefix |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1523 |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1524 if not getattr(self, 'filteredrevs', None): |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1525 try: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1526 length = max(self.index.shortest(node), minlength) |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1527 return disambiguate(hexnode, length) |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
1528 except error.RevlogError: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1529 if node != self.nodeconstants.wdirid: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
1530 raise error.LookupError( |
47169
96ee8ca99f5a
revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47167
diff
changeset
|
1531 node, self.display_id, _(b'no node') |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
1532 ) |
38012
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1533 except AttributeError: |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1534 # Fall through to pure code |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1535 pass |
0304f22497fa
revlog: use node tree (native code) for shortest() calculation
Martin von Zweigbergk <martinvonz@google.com>
parents:
37909
diff
changeset
|
1536 |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1537 if node == self.nodeconstants.wdirid: |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
1538 for length in range(minlength, len(hexnode) + 1): |
38013
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
1539 prefix = hexnode[:length] |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
1540 if isvalid(prefix): |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
1541 return prefix |
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
1542 |
45054
cc2572923ea3
revlog: avoid hard-coded hash sizes
Joerg Sonnenberger <joerg@bec.de>
parents:
44803
diff
changeset
|
1543 for length in range(minlength, len(hexnode) + 1): |
37907
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
1544 prefix = hexnode[:length] |
6921d3ecadc1
shortest: rename "test" variable to "prefix"
Martin von Zweigbergk <martinvonz@google.com>
parents:
37906
diff
changeset
|
1545 if isvalid(prefix): |
38013
0db7fe7c34d3
shortest: make pure code also disambigute against revnums at end
Martin von Zweigbergk <martinvonz@google.com>
parents:
38012
diff
changeset
|
1546 return disambiguate(hexnode, length) |
34257
448725a2ef73
templater: extract shortest() logic from template function
Martin von Zweigbergk <martinvonz@google.com>
parents:
34160
diff
changeset
|
1547 |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
1548 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
|
1549 """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
|
1550 |
a463e3c50212
cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11323
diff
changeset
|
1551 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
|
1552 """ |
2890
5df3e5cf16bc
Move cmp bits from filelog to revlog
Matt Mackall <mpm@selenic.com>
parents:
2859
diff
changeset
|
1553 p1, p2 = self.parents(node) |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
1554 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
|
1555 |
32267
1395f843ece4
revlog: rename internal functions containing "chunk" to use "segment"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31856
diff
changeset
|
1556 def _cachesegment(self, offset, data): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1557 """Add a segment to the revlog cache. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1558 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1559 Accepts an absolute offset and the data that is at that location. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1560 """ |
8316
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1561 o, d = self._chunkcache |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1562 # try to add to existing cache |
13253 | 1563 if o + len(d) == offset and len(d) + len(data) < _chunksize: |
8316
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1564 self._chunkcache = o, d + data |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1565 else: |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1566 self._chunkcache = offset, data |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1567 |
32267
1395f843ece4
revlog: rename internal functions containing "chunk" to use "segment"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31856
diff
changeset
|
1568 def _readsegment(self, offset, length, df=None): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1569 """Load a segment of raw data from the revlog. |
26377
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1570 |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1571 Accepts an absolute offset, length to read, and an optional existing |
26377
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1572 file handle to read from. |
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1573 |
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1574 If an existing file handle is passed, it will be seeked and the |
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1575 original seek position will NOT be restored. |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1576 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1577 Returns a str or buffer of raw byte data. |
40670
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1578 |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1579 Raises if the requested number of bytes could not be read. |
26377
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1580 """ |
20179
5bb3826bdac4
revlog: read/cache chunks in fixed windows of 64 KB
Brodie Rao <brodie@sf.io>
parents:
20074
diff
changeset
|
1581 # Cache data both forward and backward around the requested |
5bb3826bdac4
revlog: read/cache chunks in fixed windows of 64 KB
Brodie Rao <brodie@sf.io>
parents:
20074
diff
changeset
|
1582 # data, in a fixed size window. This helps speed up operations |
5bb3826bdac4
revlog: read/cache chunks in fixed windows of 64 KB
Brodie Rao <brodie@sf.io>
parents:
20074
diff
changeset
|
1583 # involving reading the revlog backwards. |
20180
969148b49fc6
revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents:
20179
diff
changeset
|
1584 cachesize = self._chunkcachesize |
969148b49fc6
revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents:
20179
diff
changeset
|
1585 realoffset = offset & ~(cachesize - 1) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1586 reallength = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1587 (offset + length + cachesize) & ~(cachesize - 1) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1588 ) - realoffset |
36012
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
1589 with self._datareadfp(df) as df: |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
1590 df.seek(realoffset) |
4d66993bdcff
revlog: add a _datareadfp context manager for data access needs
Boris Feld <boris.feld@octobus.net>
parents:
36011
diff
changeset
|
1591 d = df.read(reallength) |
40670
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1592 |
32267
1395f843ece4
revlog: rename internal functions containing "chunk" to use "segment"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31856
diff
changeset
|
1593 self._cachesegment(realoffset, d) |
20179
5bb3826bdac4
revlog: read/cache chunks in fixed windows of 64 KB
Brodie Rao <brodie@sf.io>
parents:
20074
diff
changeset
|
1594 if offset != realoffset or reallength != length: |
40670
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1595 startoffset = offset - realoffset |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1596 if len(d) - startoffset < length: |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1597 raise error.RevlogError( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1598 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1599 b'partial read of revlog %s; expected %d bytes from ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1600 b'offset %d, got %d' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1601 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1602 % ( |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
1603 self._indexfile if self._inline else self._datafile, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1604 length, |
47179
590f2364d33a
revlog: fix error message when data are missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47178
diff
changeset
|
1605 offset, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1606 len(d) - startoffset, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1607 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1608 ) |
40670
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1609 |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1610 return util.buffer(d, startoffset, length) |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1611 |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1612 if len(d) < length: |
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1613 raise error.RevlogError( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1614 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1615 b'partial read of revlog %s; expected %d bytes from offset ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1616 b'%d, got %d' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1617 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1618 % ( |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
1619 self._indexfile if self._inline else self._datafile, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1620 length, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1621 offset, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1622 len(d), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1623 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1624 ) |
40670
87a872555e90
revlog: detect incomplete revlog reads
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40669
diff
changeset
|
1625 |
8316
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1626 return d |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1627 |
32267
1395f843ece4
revlog: rename internal functions containing "chunk" to use "segment"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31856
diff
changeset
|
1628 def _getsegment(self, offset, length, df=None): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1629 """Obtain a segment of raw data from the revlog. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1630 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1631 Accepts an absolute offset, length of bytes to obtain, and an |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1632 optional file handle to the already-opened revlog. If the file |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1633 handle is used, it's original seek position will not be preserved. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1634 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1635 Requests for data may be returned from a cache. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1636 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1637 Returns a str or a buffer instance of raw byte data. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1638 """ |
8316
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1639 o, d = self._chunkcache |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1640 l = len(d) |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1641 |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1642 # is it in the cache? |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1643 cachestart = offset - o |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1644 cacheend = cachestart + length |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1645 if cachestart >= 0 and cacheend <= l: |
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1646 if cachestart == 0 and cacheend == l: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1647 return d # avoid a copy |
16423
a150923b49ba
revlog: avoid an expensive string copy
Bryan O'Sullivan <bryano@fb.com>
parents:
16418
diff
changeset
|
1648 return util.buffer(d, cachestart, cacheend - cachestart) |
8316
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1649 |
32267
1395f843ece4
revlog: rename internal functions containing "chunk" to use "segment"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31856
diff
changeset
|
1650 return self._readsegment(offset, length, df=df) |
8316
d593922cf480
revlog: clean up the chunk caching code
Matt Mackall <mpm@selenic.com>
parents:
8315
diff
changeset
|
1651 |
32269
75e93d95aae6
revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32267
diff
changeset
|
1652 def _getsegmentforrevs(self, startrev, endrev, df=None): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1653 """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
|
1654 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1655 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
|
1656 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
|
1657 seek position will not be preserved. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1658 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1659 Requests for data may be satisfied by a cache. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1660 |
27649
6446e9b37c8b
revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
1661 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
|
1662 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
|
1663 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
|
1664 |
6446e9b37c8b
revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
1665 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
|
1666 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
|
1667 """ |
30302
ceddc3d94d74
revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30301
diff
changeset
|
1668 # 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:
30301
diff
changeset
|
1669 # (functions are expensive). |
ceddc3d94d74
revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30301
diff
changeset
|
1670 index = self.index |
ceddc3d94d74
revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30301
diff
changeset
|
1671 istart = index[startrev] |
ceddc3d94d74
revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30301
diff
changeset
|
1672 start = int(istart[0] >> 16) |
30303
1f92056c4066
revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30302
diff
changeset
|
1673 if startrev == endrev: |
1f92056c4066
revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30302
diff
changeset
|
1674 end = start + istart[1] |
1f92056c4066
revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30302
diff
changeset
|
1675 else: |
1f92056c4066
revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30302
diff
changeset
|
1676 iend = index[endrev] |
1f92056c4066
revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30302
diff
changeset
|
1677 end = int(iend[0] >> 16) + iend[1] |
30302
ceddc3d94d74
revlog: inline start() and end() for perf reasons
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30301
diff
changeset
|
1678 |
8318
6b8513f8274a
revlog: add cache priming for reconstructing delta chains
Matt Mackall <mpm@selenic.com>
parents:
8317
diff
changeset
|
1679 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
|
1680 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
|
1681 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
|
1682 length = end - start |
27649
6446e9b37c8b
revlog: return offset from _chunkraw()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
1683 |
32267
1395f843ece4
revlog: rename internal functions containing "chunk" to use "segment"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31856
diff
changeset
|
1684 return start, self._getsegment(start, length, df=df) |
8318
6b8513f8274a
revlog: add cache priming for reconstructing delta chains
Matt Mackall <mpm@selenic.com>
parents:
8317
diff
changeset
|
1685 |
26377
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1686 def _chunk(self, rev, df=None): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1687 """Obtain a single decompressed chunk for a revision. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1688 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1689 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
|
1690 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
|
1691 be preserved. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1692 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1693 Returns a str holding uncompressed data for the requested revision. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1694 """ |
32269
75e93d95aae6
revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32267
diff
changeset
|
1695 return self.decompress(self._getsegmentforrevs(rev, rev, df=df)[1]) |
8650
ef393d6ec030
revlog: refactor chunk cache interface again
Matt Mackall <mpm@selenic.com>
parents:
8643
diff
changeset
|
1696 |
38644
43d0619cec90
revlog: enforce chunk slicing down to a certain size
Boris Feld <boris.feld@octobus.net>
parents:
38643
diff
changeset
|
1697 def _chunks(self, revs, df=None, targetsize=None): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1698 """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
|
1699 |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1700 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
|
1701 ascending order. Also accepts an optional already-open file handle |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1702 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
|
1703 not be preserved. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1704 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1705 This function is similar to calling ``self._chunk()`` multiple times, |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1706 but is faster. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1707 |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1708 Returns a list with decompressed data for each requested revision. |
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1709 """ |
19716
e17976978ee4
revlog: move chunk cache preload from revision to _chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19715
diff
changeset
|
1710 if not revs: |
e17976978ee4
revlog: move chunk cache preload from revision to _chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19715
diff
changeset
|
1711 return [] |
19713
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1712 start = self.start |
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1713 length = self.length |
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1714 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
|
1715 iosize = self.index.entry_size |
19715
1aab406be57c
revlog._chunks: inline getchunk
Siddharth Agarwal <sid0@fb.com>
parents:
19714
diff
changeset
|
1716 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
|
1717 |
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1718 l = [] |
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1719 ladd = l.append |
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1720 |
34824
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1721 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
|
1722 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
|
1723 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1724 slicedchunks = deltautil.slicechunk( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1725 self, revs, targetsize=targetsize |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1726 ) |
34824
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1727 |
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1728 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
|
1729 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
|
1730 # 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
|
1731 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
|
1732 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
|
1733 break |
34823
7891d243d821
revlog: ignore empty trailing chunks when reading segments
Paul Morelle <paul.morelle@octobus.net>
parents:
34303
diff
changeset
|
1734 |
34824
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1735 try: |
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1736 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
|
1737 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
|
1738 # 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
|
1739 # 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
|
1740 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
|
1741 |
34824
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1742 decomp = self.decompress |
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1743 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
|
1744 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
|
1745 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
|
1746 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
|
1747 chunklength = length(rev) |
e2ad93bcc084
revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents:
34823
diff
changeset
|
1748 ladd(decomp(buffer(data, chunkstart - offset, chunklength))) |
19713
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1749 |
c2e27e57d250
revlog: add a fast method for getting a list of chunks
Siddharth Agarwal <sid0@fb.com>
parents:
19625
diff
changeset
|
1750 return l |
14075
bc101902a68d
revlog: introduce _chunkbase to allow filelog to override
Sune Foldager <cryo@cyanite.org>
parents:
14064
diff
changeset
|
1751 |
8650
ef393d6ec030
revlog: refactor chunk cache interface again
Matt Mackall <mpm@selenic.com>
parents:
8643
diff
changeset
|
1752 def _chunkclear(self): |
27070
7860366b46c9
revlog: improve documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26907
diff
changeset
|
1753 """Clear the raw chunk cache.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1754 self._chunkcache = (0, b'') |
1598
14d1f1868bf6
cleanup of revlog.group when repository is local
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1755 |
11929
1839a7518b0d
revlog: deltachain() returns chain of revs need to construct a revision
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
11928
diff
changeset
|
1756 def deltaparent(self, rev): |
14195
0013d3eeb826
revlog: remove support for parentdelta
Sune Foldager <cryo@cyanite.org>
parents:
14164
diff
changeset
|
1757 """return deltaparent of the given revision""" |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
1758 base = self.index[rev][3] |
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
1759 if base == rev: |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
1760 return nullrev |
14253
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
1761 elif self._generaldelta: |
c28d5200374c
revlog: support reading generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents:
14252
diff
changeset
|
1762 return base |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
1763 else: |
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
1764 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
|
1765 |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
1766 def issnapshot(self, rev): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
1767 """tells whether rev is a snapshot""" |
41089
a28833d79aca
revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41087
diff
changeset
|
1768 if not self._sparserevlog: |
a28833d79aca
revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41087
diff
changeset
|
1769 return self.deltaparent(rev) == nullrev |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1770 elif util.safehasattr(self.index, b'issnapshot'): |
41089
a28833d79aca
revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41087
diff
changeset
|
1771 # 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:
41087
diff
changeset
|
1772 self.issnapshot = self.index.issnapshot |
a28833d79aca
revlog: use the native implementation of issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41087
diff
changeset
|
1773 return self.issnapshot(rev) |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
1774 if rev == nullrev: |
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
1775 return True |
41087
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1776 entry = self.index[rev] |
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1777 base = entry[3] |
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1778 if base == rev: |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
1779 return True |
41087
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1780 if base == nullrev: |
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1781 return True |
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1782 p1 = entry[5] |
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1783 p2 = entry[6] |
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1784 if base == p1 or base == p2: |
39183
f39efa885a6d
revlog: also detect intermediate snapshots
Paul Morelle <paul.morelle@octobus.net>
parents:
39182
diff
changeset
|
1785 return False |
41087
84491ae0b3f0
revlog: more efficient implementation for issnapshot
Boris Feld <boris.feld@octobus.net>
parents:
41086
diff
changeset
|
1786 return self.issnapshot(base) |
39182
f8db458651c8
revlog: add a method to tells whether rev is stored as a snapshot
Paul Morelle <paul.morelle@octobus.net>
parents:
39180
diff
changeset
|
1787 |
39185
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
1788 def snapshotdepth(self, rev): |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
1789 """number of snapshot in the chain before this one""" |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
1790 if not self.issnapshot(rev): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1791 raise error.ProgrammingError(b'revision %d not a snapshot') |
39185
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
1792 return len(self._deltachain(rev)[0]) - 1 |
3b1042cab4b4
revlog: add a method to retrieve snapshot depth
Boris Feld <boris.feld@octobus.net>
parents:
39183
diff
changeset
|
1793 |
1941
7518823709a2
revlog.py: factorization and fixes for rev < 0 (nullid)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1853
diff
changeset
|
1794 def revdiff(self, rev1, rev2): |
31758
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
1795 """return or calculate a delta between two revisions |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
1796 |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
1797 The delta calculated is in binary form and is intended to be written to |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
1798 revlog data directly. So this function needs raw revision data. |
5d11b5edcb0b
revlog: use raw revisions in revdiff
Jun Wu <quark@fb.com>
parents:
31757
diff
changeset
|
1799 """ |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
14196
diff
changeset
|
1800 if rev1 != nullrev and self.deltaparent(rev2) == rev1: |
31378
b6f5af372c0c
revlog: use bytes() instead of str() to get data from memoryview
Augie Fackler <augie@google.com>
parents:
31366
diff
changeset
|
1801 return bytes(self._chunk(rev2)) |
5005
72082bfced9a
revlog: minor revdiff reorganization
Matt Mackall <mpm@selenic.com>
parents:
5004
diff
changeset
|
1802 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1803 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
|
1804 |
42995
01304095256c
flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42994
diff
changeset
|
1805 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:
42994
diff
changeset
|
1806 """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
|
1807 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
|
1808 util.nouideprecwarn(msg, b'5.2', stacklevel=2) |
42995
01304095256c
flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42994
diff
changeset
|
1809 if raw: |
01304095256c
flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42994
diff
changeset
|
1810 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
|
1811 elif operation == b'read': |
42995
01304095256c
flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42994
diff
changeset
|
1812 return flagutil.processflagsread(self, text, flags) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1813 else: # write operation |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1814 return flagutil.processflagswrite(self, text, flags) |
42995
01304095256c
flagprocessors: directly duplicate the deprecated layer back into revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42994
diff
changeset
|
1815 |
30743
2df983125d37
revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents:
30589
diff
changeset
|
1816 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
|
1817 """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
|
1818 number. |
26377
dfef0d3be65e
revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26376
diff
changeset
|
1819 |
30743
2df983125d37
revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents:
30589
diff
changeset
|
1820 _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:
30589
diff
changeset
|
1821 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:
30589
diff
changeset
|
1822 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:
30589
diff
changeset
|
1823 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
|
1824 """ |
42853
f75f47b3ea41
revlog: deprecate the use of `revision(..., raw=True)`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42824
diff
changeset
|
1825 if raw: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1826 msg = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1827 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
|
1828 b'use revlog.rawdata(...)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1829 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1830 util.nouideprecwarn(msg, b'5.2', stacklevel=2) |
42983
35ab2c1a58aa
revlog: return sidedata map from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42982
diff
changeset
|
1831 return self._revisiondata(nodeorrev, _df, raw=raw)[0] |
42735
389233789952
revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42711
diff
changeset
|
1832 |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1833 def sidedata(self, nodeorrev, _df=None): |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1834 """a map of extra data related to the changeset but not part of the hash |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1835 |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1836 This function currently return a dictionary. However, more advanced |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1837 mapping object will likely be used in the future for a more |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1838 efficient/lazy code. |
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1839 """ |
42984
9d62f9fa332f
revlog: use the new sidedata map return in the sidedata method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42983
diff
changeset
|
1840 return self._revisiondata(nodeorrev, _df)[1] |
42982
0d1272783f24
revlog: introduce a `sidedata` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42885
diff
changeset
|
1841 |
42735
389233789952
revlog: split a `_revisiondata` method to file `revision` job
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42711
diff
changeset
|
1842 def _revisiondata(self, nodeorrev, _df=None, raw=False): |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
1843 # deal with <nodeorrev> argument type |
16375
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1844 if isinstance(nodeorrev, int): |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1845 rev = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1846 node = self.node(rev) |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1847 else: |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1848 node = nodeorrev |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1849 rev = None |
d7d64b89a65c
revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents:
16374
diff
changeset
|
1850 |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
1851 # fast path the special `nullid` rev |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
1852 if node == self.nullid: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1853 return b"", {} |
42805
bf070a59546a
revlog: move `nullid` early return sooner in `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42804
diff
changeset
|
1854 |
43984
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43962
diff
changeset
|
1855 # ``rawtext`` is the text as stored inside the revlog. Might be the |
bdb357161d7a
revlog: drop an unused variable assignment
Matt Harbison <matt_harbison@yahoo.com>
parents:
43962
diff
changeset
|
1856 # revision or might need to be processed to retrieve the revision. |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1857 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:
42807
diff
changeset
|
1858 |
47150
84b176ad2860
revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
1859 if self.hassidedata: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1860 if rev is None: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1861 rev = self.rev(node) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1862 sidedata = self._sidedata(rev) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1863 else: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1864 sidedata = {} |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1865 |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1866 if raw and validated: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1867 # if we don't want to process the raw text and that raw |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1868 # text is cached, we can exit early. |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1869 return rawtext, sidedata |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1870 if rev is None: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1871 rev = self.rev(node) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1872 # the revlog's flag for this revision |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1873 # (usually alter its state or content) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1874 flags = self.flags(rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1875 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1876 if validated and flags == REVIDX_DEFAULT_FLAGS: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1877 # no extra flags set, no flag processor runs, text = rawtext |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1878 return rawtext, sidedata |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1879 |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
1880 if raw: |
42994
dff95420480f
flagprocessors: make `processflagsraw` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42993
diff
changeset
|
1881 validatehash = flagutil.processflagsraw(self, rawtext, flags) |
42885
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
1882 text = rawtext |
4a3efe0febb5
revlog: stop using `_processflags` directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42882
diff
changeset
|
1883 else: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1884 r = flagutil.processflagsread(self, rawtext, flags) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1885 text, validatehash = r |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1886 if validatehash: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1887 self.checkhash(text, node, rev=rev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1888 if not validated: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1889 self._revisioncache = (node, rev, rawtext) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1890 |
42983
35ab2c1a58aa
revlog: return sidedata map from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42982
diff
changeset
|
1891 return text, sidedata |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1892 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1893 def _rawtext(self, node, rev, _df=None): |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1894 """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:
42807
diff
changeset
|
1895 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1896 returns (rev, rawtext, validated) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1897 """ |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1898 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1899 # 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:
42807
diff
changeset
|
1900 cachedrev = None |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
1901 # An intermediate text to apply deltas to |
42804
2eec53a99ec1
revlog: stop calling `basetext` `rawtext` in _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42803
diff
changeset
|
1902 basetext = None |
42806
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
1903 |
616aa62e5027
revlog: add some documentation to `_revisiondata` code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42805
diff
changeset
|
1904 # 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:
42805
diff
changeset
|
1905 # The cache entry looks like (node, rev, rawtext) |
40053
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
1906 if self._revisioncache: |
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
1907 if self._revisioncache[0] == node: |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1908 return (rev, self._revisioncache[2], True) |
40053
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
1909 cachedrev = self._revisioncache[1] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
1910 |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1911 if rev is None: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1912 rev = self.rev(node) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1913 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1914 chain, stopped = self._deltachain(rev, stoprev=cachedrev) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1915 if stopped: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1916 basetext = self._revisioncache[2] |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1917 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1918 # 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:
42807
diff
changeset
|
1919 # update self._revisioncache after validating the text |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1920 self._revisioncache = None |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1921 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1922 targetsize = None |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1923 rawsize = self.index[rev][2] |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1924 if 0 <= rawsize: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1925 targetsize = 4 * rawsize |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1926 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1927 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:
42807
diff
changeset
|
1928 if basetext is None: |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1929 basetext = bytes(bins[0]) |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1930 bins = bins[1:] |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1931 |
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1932 rawtext = mdiff.patches(basetext, bins) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1933 del basetext # let us have a chance to free memory early |
42808
e91411fcc697
revlog: split `rawtext` retrieval out of _revisiondata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42807
diff
changeset
|
1934 return (rev, rawtext, False) |
13239
12ed25f39d0b
revlog: break hash checking into subfunction
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
1935 |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1936 def _sidedata(self, rev): |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1937 """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:
46717
diff
changeset
|
1938 index_entry = self.index[rev] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1939 sidedata_offset = index_entry[8] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1940 sidedata_size = index_entry[9] |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1941 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1942 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
|
1943 sidedata_offset += self.index.entry_size * (1 + rev) |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1944 if sidedata_size == 0: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1945 return {} |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1946 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1947 segment = self._getsegment(sidedata_offset, sidedata_size) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1948 sidedata = sidedatautil.deserialize_sidedata(segment) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1949 return sidedata |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
1950 |
42802
ef177c04ac7f
revlog: drop silly `raw` parameter to `rawdata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42784
diff
changeset
|
1951 def rawdata(self, nodeorrev, _df=None): |
42736
415e4136d326
rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42735
diff
changeset
|
1952 """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:
42735
diff
changeset
|
1953 |
415e4136d326
rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42735
diff
changeset
|
1954 _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:
42735
diff
changeset
|
1955 """ |
42983
35ab2c1a58aa
revlog: return sidedata map from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42982
diff
changeset
|
1956 return self._revisiondata(nodeorrev, _df, raw=True)[0] |
42736
415e4136d326
rawdata: introduce a `rawdata` method on revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42735
diff
changeset
|
1957 |
22785
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
1958 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
|
1959 """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
|
1960 |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
1961 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
|
1962 as needed. |
abc44fcc9c57
revlog: move references to revlog.hash to inside the revlog class
Augie Fackler <raf@durin42.com>
parents:
22784
diff
changeset
|
1963 """ |
39882
f8eb71f9e3bd
storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39877
diff
changeset
|
1964 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
|
1965 |
30589
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
1966 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
1967 """Check node hash integrity. |
19624
55749cb14d24
revlog: extract 'checkhash' method
Wojciech Lopata <lopek@fb.com>
parents:
19471
diff
changeset
|
1968 |
30589
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
1969 Available as a function so that subclasses can extend hash mismatch |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
1970 behaviors as needed. |
be5b2098a817
revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents:
30552
diff
changeset
|
1971 """ |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1972 try: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1973 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
|
1974 p1, p2 = self.parents(node) |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1975 if node != self.hash(text, p1, p2): |
40055
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1976 # Clear the revision cache on hash failure. The revision cache |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1977 # only stores the raw revision and clearing the cache does have |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1978 # the side-effect that we won't have a cache hit when the raw |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1979 # revision data is accessed. But this case should be rare and |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1980 # it is extra work to teach the cache about the hash |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1981 # verification state. |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1982 if self._revisioncache and self._revisioncache[0] == node: |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1983 self._revisioncache = None |
801ccd8e67c0
revlog: clear revision cache on hash verification failure
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40053
diff
changeset
|
1984 |
37443
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1985 revornode = rev |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1986 if revornode is None: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
1987 revornode = templatefilters.short(hex(node)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1988 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1989 _(b"integrity check failed on %s:%s") |
47174
0a66eef0ed97
revlog: use revlog.display_id in integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47173
diff
changeset
|
1990 % (self.display_id, pycompat.bytestr(revornode)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
1991 ) |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
1992 except error.RevlogError: |
39884
d269ddbf54f0
storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39883
diff
changeset
|
1993 if self._censorable and storageutil.iscensoredtext(text): |
47175
f574734eb2b7
revlog: use revlog.display_id in censor related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47174
diff
changeset
|
1994 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
|
1995 raise |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
1996 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
1997 def _enforceinlinesize(self, tr): |
26376
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
1998 """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
|
1999 |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2000 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
|
2001 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
|
2002 to use multiple index and data files. |
344a1621674b
revlog: add docstring for checkinlinesize()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26243
diff
changeset
|
2003 """ |
38883
119d14f41cb2
revlog: remove some knowledge of sentinel nullid in index
Martin von Zweigbergk <martinvonz@google.com>
parents:
38880
diff
changeset
|
2004 tiprev = len(self) - 1 |
47181
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47180
diff
changeset
|
2005 total_size = self.start(tiprev) + self.length(tiprev) |
88bd08a6830f
revlog: simplify a conditionnal in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47180
diff
changeset
|
2006 if not self._inline or total_size < _maxinline: |
2073 | 2007 return |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2008 |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2009 troffset = tr.findoffset(self._indexfile) |
45885
a6f08085edfe
transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents:
45884
diff
changeset
|
2010 if troffset is None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2011 raise error.RevlogError( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2012 _(b"%s not found in the transaction") % self._indexfile |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2013 ) |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45879
diff
changeset
|
2014 trindex = 0 |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2015 tr.add(self._datafile, 0) |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2016 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2017 existing_handles = False |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2018 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:
47224
diff
changeset
|
2019 existing_handles = True |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2020 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
|
2021 fp.flush() |
5cdf4067857a
revlog: use chunk cache to avoid rereading when splitting inline files
Matt Mackall <mpm@selenic.com>
parents:
8316
diff
changeset
|
2022 fp.close() |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
2023 # 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:
40670
diff
changeset
|
2024 # its usage. |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
2025 self._writinghandles = None |
8315
c8493310ad9b
revlog: use index to find index size
Matt Mackall <mpm@selenic.com>
parents:
8314
diff
changeset
|
2026 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2027 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:
47224
diff
changeset
|
2028 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:
47224
diff
changeset
|
2029 try: |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
2030 with self._indexfp() as read_ifh: |
47224
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2031 for r in self: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2032 new_dfh.write(self._getsegmentforrevs(r, r, df=read_ifh)[1]) |
47224
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2033 if troffset <= self.start(r): |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2034 trindex = r |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2035 new_dfh.flush() |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2036 |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
2037 with self.__index_new_fp() as fp: |
47224
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2038 self._format_flags &= ~FLAG_INLINE_DATA |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2039 self._inline = False |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2040 for i in self: |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2041 e = self.index.entry_binary(i) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
2042 if i == 0 and self._docket is None: |
47224
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2043 header = self._format_flags | self._format_version |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2044 header = self.index.pack_header(header) |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2045 e = header + e |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2046 fp.write(e) |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2047 if self._docket is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2048 self._docket.index_end = fp.tell() |
47224
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2049 # 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:
47223
diff
changeset
|
2050 # manager |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2051 |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2052 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:
47223
diff
changeset
|
2053 nodemaputil.setup_persistent_nodemap(tr, self) |
100f061d88f6
revlog: preindent some code in _enforceinlinesize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47223
diff
changeset
|
2054 self._chunkclear() |
2073 | 2055 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2056 if existing_handles: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2057 # switched from inline to conventional reopen the index |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
2058 ifh = self.__index_write_fp() |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2059 self._writinghandles = (ifh, new_dfh) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2060 new_dfh = None |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2061 finally: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2062 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:
47224
diff
changeset
|
2063 new_dfh.close() |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2064 |
39891
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39886
diff
changeset
|
2065 def _nodeduplicatecallback(self, transaction, node): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
2066 """called when trying to add a node already stored.""" |
39891
debc4ee597e7
revlog: add a callback "tracking" duplicate node addition
Boris Feld <boris.feld@octobus.net>
parents:
39886
diff
changeset
|
2067 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2068 @contextlib.contextmanager |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2069 def _writing(self, transaction): |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2070 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:
47224
diff
changeset
|
2071 yield |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2072 else: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2073 r = len(self) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2074 dsize = 0 |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2075 if r: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2076 dsize = self.end(r - 1) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2077 dfh = None |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2078 if not self._inline: |
47228
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2079 try: |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2080 dfh = self._datafp(b"r+") |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2081 dfh.seek(0, os.SEEK_END) |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2082 except IOError as inst: |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2083 if inst.errno != errno.ENOENT: |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2084 raise |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
2085 dfh = self._datafp(b"w+") |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2086 transaction.add(self._datafile, dsize) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2087 try: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2088 isize = r * self.index.entry_size |
47230
ffa8afc5f931
revlog: only use the `_indexfp` method for read operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47229
diff
changeset
|
2089 ifh = self.__index_write_fp() |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2090 if self._inline: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2091 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:
47224
diff
changeset
|
2092 else: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2093 transaction.add(self._indexfile, isize) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2094 try: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2095 self._writinghandles = (ifh, dfh) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2096 try: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2097 yield |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
2098 if self._docket is not None: |
47250
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2099 self._write_docket(transaction) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2100 finally: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2101 self._writinghandles = None |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2102 finally: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2103 ifh.close() |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2104 finally: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2105 if dfh is not None: |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2106 dfh.close() |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2107 |
47250
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2108 def _write_docket(self, transaction): |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2109 """write the current docket on disk |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2110 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2111 Exist as a method to help changelog to implement transaction logic |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2112 |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2113 We could also imagine using the same transaction logic for all revlog |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2114 since docket are cheap.""" |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2115 self._docket.write(transaction) |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47249
diff
changeset
|
2116 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2117 def addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2118 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2119 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2120 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2121 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2122 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2123 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2124 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2125 node=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2126 flags=REVIDX_DEFAULT_FLAGS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2127 deltacomputer=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2128 sidedata=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2129 ): |
1083 | 2130 """add a revision to the log |
2131 | |
2132 text - the revision data to add | |
2133 transaction - the transaction object used for rollback | |
2134 link - the linkrev data to add | |
2135 p1, p2 - the parent nodeids of the revision | |
12012
bade7a9c5c07
revlog: fix docstring
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12011
diff
changeset
|
2136 cachedelta - an optional precomputed delta |
19625
6a411a06cb1f
revlog: pass node as an argument of addrevision
Wojciech Lopata <lopek@fb.com>
parents:
19624
diff
changeset
|
2137 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
|
2138 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
|
2139 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
|
2140 flags - the known flags to set on the revision |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
2141 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
|
2142 multiple calls |
1083 | 2143 """ |
19326
7014526d67a8
revlog: add exception when linkrev == nullrev
Durham Goode <durham@fb.com>
parents:
19200
diff
changeset
|
2144 if link == nullrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2145 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
2146 _(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
|
2147 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
2148 |
42988
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
2149 if sidedata is None: |
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
2150 sidedata = {} |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2151 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:
43027
diff
changeset
|
2152 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2153 _(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
|
2154 ) |
42988
33532939c667
revlog: add a `sidedata` parameters to addrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42987
diff
changeset
|
2155 |
30745 | 2156 if flags: |
2157 node = node or self.hash(text, p1, p2) | |
2158 | |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2159 rawtext, validatehash = flagutil.processflagswrite(self, text, flags) |
30745 | 2160 |
2161 # If the flag processor modifies the revision data, ignore any provided | |
2162 # cachedelta. | |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
2163 if rawtext != text: |
30745 | 2164 cachedelta = None |
2165 | |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
2166 if len(rawtext) > _maxentrysize: |
39789
2cd93a8d4bde
revlog: drop RevlogError alias (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39785
diff
changeset
|
2167 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2168 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2169 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
|
2170 ) |
47176
dfe8074239de
revlog: use revlog.display_id in "revision too big" errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47175
diff
changeset
|
2171 % (self.display_id, len(rawtext)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2172 ) |
25459
0bda5bfaf0b1
revlog: move size limit check to addrevision
Matt Mackall <mpm@selenic.com>
parents:
25410
diff
changeset
|
2173 |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
2174 node = node or self.hash(rawtext, p1, p2) |
46560
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
2175 rev = self.index.get_rev(node) |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
2176 if rev is not None: |
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
2177 return rev |
12023
44c22dc193a4
revlog.addrevision(): move computation of nodeid in addrevision()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12012
diff
changeset
|
2178 |
30745 | 2179 if validatehash: |
31755
f319981c24c9
revlog: rename some "text"s to "rawtext"
Jun Wu <quark@fb.com>
parents:
31754
diff
changeset
|
2180 self.checkhash(rawtext, node, p1=p1, p2=p2) |
30745 | 2181 |
46560
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46559
diff
changeset
|
2182 return self.addrawrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2183 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2184 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2185 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2186 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2187 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2188 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2189 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2190 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2191 deltacomputer=deltacomputer, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2192 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2193 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2194 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2195 def addrawrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2196 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2197 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2198 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2199 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2200 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2201 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2202 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2203 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2204 cachedelta=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2205 deltacomputer=None, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2206 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2207 ): |
32284
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
2208 """add a raw revision with known flags, node and parents |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
2209 useful when reusing a revision not stored in this revlog (ex: received |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
2210 over wire, or read from an external bundle). |
3de4c61b5087
revlog: move part of "addrevision" to "addrawrevision"
Jun Wu <quark@fb.com>
parents:
32269
diff
changeset
|
2211 """ |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2212 with self._writing(transaction): |
46559
9ee4e988e2be
revlog: change addrawrevision to return the revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46558
diff
changeset
|
2213 return self._addrevision( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2214 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2215 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2216 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2217 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2218 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2219 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2220 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2221 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2222 deltacomputer=deltacomputer, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2223 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2224 ) |
3390
a74addddd092
make revlog.addgroup pass its file handles to addrevision
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3360
diff
changeset
|
2225 |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2226 def compress(self, data): |
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2227 """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
|
2228 if not data: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2229 return b'', data |
30795
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2230 |
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2231 compressed = self._compressor.compress(data) |
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2232 |
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2233 if compressed: |
78ac56aebab6
revlog: use compression engine API for compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30793
diff
changeset
|
2234 # 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
|
2235 return b'', compressed |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2236 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2237 if data[0:1] == b'\0': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2238 return b'', data |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2239 return b'u', data |
17128
1028a1c9077a
revlog: make compress a method
Bryan O'Sullivan <bryano@fb.com>
parents:
17009
diff
changeset
|
2240 |
30793
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2241 def decompress(self, data): |
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2242 """Decompress a revlog chunk. |
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2243 |
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2244 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
|
2245 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
|
2246 """ |
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2247 if not data: |
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2248 return data |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2249 |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2250 # 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
|
2251 # 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
|
2252 # important here. |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2253 # |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2254 # 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
|
2255 # |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2256 # 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
|
2257 # raw data). |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2258 # 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
|
2259 # returning raw inline data. |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2260 # 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
|
2261 # engines |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2262 # |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2263 # 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
|
2264 # 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
|
2265 # 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
|
2266 # 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
|
2267 # followed by the compengines lookup. |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2268 # |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2269 # 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
|
2270 # compressed chunks. And this matters for changelog and manifest reads. |
31365
ef6888172437
revlog: extract first byte of revlog with a slice so it's portable
Augie Fackler <augie@google.com>
parents:
30829
diff
changeset
|
2271 t = data[0:1] |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2272 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2273 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
|
2274 try: |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2275 return _zlibdecompress(data) |
30793
b6f455a6e4d6
revlog: move decompress() from module to revlog class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30792
diff
changeset
|
2276 except zlib.error as e: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2277 raise error.RevlogError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2278 _(b'revlog decompress error: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2279 % stringutil.forcebytestr(e) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2280 ) |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2281 # '\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
|
2282 elif t == b'\0': |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2283 return data |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2284 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
|
2285 return util.buffer(data, 1) |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2286 |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2287 try: |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2288 compressor = self._decompressors[t] |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2289 except KeyError: |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2290 try: |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2291 engine = util.compengines.forrevlogheader(t) |
42043
1fac9b931d46
compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41877
diff
changeset
|
2292 compressor = engine.revlogcompressor(self._compengineopts) |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2293 self._decompressors[t] = compressor |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2294 except KeyError: |
46852
fbfb1d6d8459
revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
46819
diff
changeset
|
2295 raise error.RevlogError( |
fbfb1d6d8459
revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
46819
diff
changeset
|
2296 _(b'unknown compression type %s') % binascii.hexlify(t) |
fbfb1d6d8459
revlog: fix error about unknown compression format in py3
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents:
46819
diff
changeset
|
2297 ) |
30817
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2298 |
2b279126b8f5
revlog: use compression engine APIs for decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30795
diff
changeset
|
2299 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
|
2300 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2301 def _addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2302 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2303 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2304 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2305 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2306 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2307 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2308 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2309 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2310 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2311 alwayscache=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2312 deltacomputer=None, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2313 sidedata=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2314 ): |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
2315 """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
|
2316 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
2317 see addrevision for argument descriptions. |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2318 |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2319 note: "addrevision" takes non-raw text, "_addrevision" takes raw text. |
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2320 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
2321 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
|
2322 be used. |
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
2323 |
14292
c97d8485b5fa
revlog: add docstring to _addrevision
Sune Foldager <cryo@cyanite.org>
parents:
14270
diff
changeset
|
2324 invariants: |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2325 - 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
|
2326 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
|
2327 """ |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2328 if node == self.nullid: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2329 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
2330 _(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
|
2331 ) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2332 if ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2333 node == self.nodeconstants.wdirid |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2334 or node in self.nodeconstants.wdirfilenodeids |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
2335 ): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2336 raise error.RevlogError( |
47177
6bc7c467a7d1
revlog: use revlog.display_id in error related to bad revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47176
diff
changeset
|
2337 _(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
|
2338 ) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2339 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:
47224
diff
changeset
|
2340 msg = b'adding revision outside `revlog._writing` context' |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2341 raise error.ProgrammingError(msg) |
34045
bfb38c5cebf4
revlog: move check for wdir from changelog to revlog
Martin von Zweigbergk <martinvonz@google.com>
parents:
34044
diff
changeset
|
2342 |
35635
0b52c0ecbc23
revlog: choose between ifh and dfh once for all
Paul Morelle <paul.morelle@octobus.net>
parents:
35634
diff
changeset
|
2343 if self._inline: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2344 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
|
2345 else: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2346 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
|
2347 |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2348 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
|
2349 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2350 curr = len(self) |
4981
e7131935fbb3
revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents:
4980
diff
changeset
|
2351 prev = curr - 1 |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2352 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2353 offset = self._get_data_offset(prev) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2354 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2355 if self._concurrencychecker: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2356 ifh, dfh = self._writinghandles |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2357 if self._inline: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2358 # offset is "as if" it were in the .d file, so we need to add on |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2359 # the size of the entry metadata. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2360 self._concurrencychecker( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2361 ifh, self._indexfile, offset + curr * self.index.entry_size |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2362 ) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2363 else: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2364 # Entries in the .i are a consistent size. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2365 self._concurrencychecker( |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2366 ifh, self._indexfile, curr * self.index.entry_size |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2367 ) |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2368 self._concurrencychecker(dfh, self._datafile, offset) |
46646
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46561
diff
changeset
|
2369 |
12889
5482c6b826f4
revlog: precalculate p1 and p2 revisions
Matt Mackall <mpm@selenic.com>
parents:
12888
diff
changeset
|
2370 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
|
2371 |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
2372 # 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
|
2373 # become comparable to the uncompressed text |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2374 if rawtext is None: |
35841
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
2375 # need rawtext size, before changed by flag processors, which is |
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
2376 # the non-raw size. use revlog explicitly to avoid filelog's extra |
369aadf7a326
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
Jun Wu <quark@fb.com>
parents:
35840
diff
changeset
|
2377 # logic that might remove metadata size. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2378 textlen = mdiff.patchedsize( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2379 revlog.size(self, cachedelta[0]), cachedelta[1] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2380 ) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
2381 else: |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2382 textlen = len(rawtext) |
26116
562cfc99e611
revlog: move textlen calculation to be above delta chooser
Durham Goode <durham@fb.com>
parents:
26115
diff
changeset
|
2383 |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
2384 if deltacomputer is None: |
39357
655b5b465953
revlog: split functionality related to deltas computation in a new module
Boris Feld <boris.feld@octobus.net>
parents:
39356
diff
changeset
|
2385 deltacomputer = deltautil.deltacomputer(self) |
35738
f90f6fd130c1
revlog: group delta computation methods under _deltacomputer object
Paul Morelle <paul.morelle@octobus.net>
parents:
35737
diff
changeset
|
2386 |
35737
d99b07bc69fb
revlog: refactor out _finddeltainfo from _addrevision
Paul Morelle <paul.morelle@octobus.net>
parents:
35641
diff
changeset
|
2387 revinfo = _revisioninfo(node, p1, p2, btext, textlen, cachedelta, flags) |
35840
33275ab5e837
revlog: do not use delta for lfs revisions
Jun Wu <quark@fb.com>
parents:
35839
diff
changeset
|
2388 |
39359
6f4b8f607a31
revlogdeltas: move special cases around raw revisions in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39357
diff
changeset
|
2389 deltainfo = deltacomputer.finddeltainfo(revinfo, fh) |
35634
b43578ec483a
revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net>
parents:
35525
diff
changeset
|
2390 |
47150
84b176ad2860
revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
2391 if sidedata and self.hassidedata: |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2392 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata) |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2393 sidedata_offset = offset + deltainfo.deltalen |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2394 else: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2395 serialized_sidedata = b"" |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2396 # Don't store the offset if the sidedata is empty, that way |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2397 # we can easily detect empty sidedata and they will be no different |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2398 # than ones we manually add. |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2399 sidedata_offset = 0 |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2400 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2401 e = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2402 offset_type(offset, flags), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2403 deltainfo.deltalen, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2404 textlen, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2405 deltainfo.base, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2406 link, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2407 p1r, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2408 p2r, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2409 node, |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2410 sidedata_offset, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2411 len(serialized_sidedata), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2412 ) |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46646
diff
changeset
|
2413 |
38889
6104b203bec8
index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38888
diff
changeset
|
2414 self.index.append(e) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
2415 entry = self.index.entry_binary(curr) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
2416 if curr == 0 and self._docket is None: |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2417 header = self._format_flags | self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2418 header = self.index.pack_header(header) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
2419 entry = header + entry |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2420 self._writeentry( |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2421 transaction, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2422 entry, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2423 deltainfo.data, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2424 link, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2425 offset, |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2426 serialized_sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2427 ) |
39360
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
2428 |
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
2429 rawtext = btext[0] |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
2430 |
31760
ec48d57de110
revlog: make _addrevision only accept rawtext
Jun Wu <quark@fb.com>
parents:
31759
diff
changeset
|
2431 if alwayscache and rawtext is None: |
39225
dbc5ead9f40f
revlog: fix typo in 'buildtext' name
Boris Feld <boris.feld@octobus.net>
parents:
39224
diff
changeset
|
2432 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
|
2433 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2434 if type(rawtext) == bytes: # only accept immutable objects |
40053
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
2435 self._revisioncache = (node, curr, rawtext) |
39360
5d343a24bff5
revlogdeltas: always return a delta info object in finddeltainfo
Boris Feld <boris.feld@octobus.net>
parents:
39359
diff
changeset
|
2436 self._chainbasecache[curr] = deltainfo.chainbase |
46558
07984507d553
revlog: change _addrevision to return the new revision
Joerg Sonnenberger <joerg@bec.de>
parents:
46530
diff
changeset
|
2437 return curr |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
2438 |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2439 def _get_data_offset(self, prev): |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2440 """Returns the current offset in the (in-transaction) data file. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2441 Versions < 2 of the revlog can get this 0(1), revlog v2 needs a docket |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2442 file to store that information: since sidedata can be rewritten to the |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2443 end of the data file within a transaction, you can have cases where, for |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2444 example, rev `n` does not have sidedata while rev `n - 1` does, leading |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2445 to `n - 1`'s sidedata being written after `n`'s data. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2446 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2447 TODO cache this in a docket file before getting out of experimental.""" |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2448 if self._format_version != REVLOGV2: |
46723
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2449 return self.end(prev) |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2450 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2451 offset = 0 |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2452 for rev, entry in enumerate(self.index): |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2453 sidedata_end = entry[8] + entry[9] |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2454 # Sidedata for a previous rev has potentially been written after |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2455 # this rev's end, so take the max. |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2456 offset = max(self.end(rev), offset, sidedata_end) |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2457 return offset |
4cd214c9948d
revlogv2: don't assume that the sidedata of the last rev is right after data
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46722
diff
changeset
|
2458 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2459 def _writeentry(self, transaction, entry, data, link, offset, sidedata): |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
2460 # 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
|
2461 # 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
|
2462 # 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
|
2463 # 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
|
2464 # 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
|
2465 # 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
|
2466 # 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
|
2467 # |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
2468 # We work around this issue by inserting a seek() before writing. |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
2469 # Note: This is likely not necessary on Python 3. However, because |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
2470 # the file handle is reused for reads and may be seeked there, we need |
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
2471 # to be careful before changing this. |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2472 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:
47224
diff
changeset
|
2473 msg = b'adding revision outside `revlog._writing` context' |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2474 raise error.ProgrammingError(msg) |
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2475 ifh, dfh = self._writinghandles |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2476 if self._docket is None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2477 ifh.seek(0, os.SEEK_END) |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2478 else: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2479 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
|
2480 if dfh: |
27430
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
2481 dfh.seek(0, os.SEEK_END) |
e240e914d226
revlog: seek to end of file before writing (issue4943)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26705
diff
changeset
|
2482 |
20217
33394f2e331e
revlog: move file writing to a separate function
Durham Goode <durham@fb.com>
parents:
20180
diff
changeset
|
2483 curr = len(self) - 1 |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
2484 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2485 transaction.add(self._datafile, offset) |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2486 transaction.add(self._indexfile, curr * len(entry)) |
2073 | 2487 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
|
2488 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
|
2489 dfh.write(data[1]) |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2490 if sidedata: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2491 dfh.write(sidedata) |
4981
e7131935fbb3
revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents:
4980
diff
changeset
|
2492 ifh.write(entry) |
2073 | 2493 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
|
2494 offset += curr * self.index.entry_size |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2495 transaction.add(self._indexfile, offset) |
4981
e7131935fbb3
revlog: simplify addrevision
Matt Mackall <mpm@selenic.com>
parents:
4980
diff
changeset
|
2496 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
|
2497 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
|
2498 ifh.write(data[1]) |
46722
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2499 if sidedata: |
3d740058b467
sidedata: move to new sidedata storage in revlogv2
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
2500 ifh.write(sidedata) |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2501 self._enforceinlinesize(transaction) |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2502 if self._docket is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2503 self._docket.index_end = self._writinghandles[0].tell() |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2504 |
44351
5962fd0d1045
nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44073
diff
changeset
|
2505 nodemaputil.setup_persistent_nodemap(transaction, self) |
2073 | 2506 |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2507 def addgroup( |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2508 self, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2509 deltas, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2510 linkmapper, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2511 transaction, |
46445
711ba0f1057e
revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents:
46310
diff
changeset
|
2512 alwayscache=False, |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2513 addrevisioncb=None, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2514 duplicaterevisioncb=None, |
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2515 ): |
1083 | 2516 """ |
2517 add a delta group | |
46 | 2518 |
1083 | 2519 given a set of deltas, add them to the revision log. the |
2520 first delta is against its parent, which should be in our | |
2521 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
|
2522 |
00e3f909907f
revlog: add support for a callback whenever revisions are added
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
2523 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
|
2524 this revlog and the node that was added. |
1083 | 2525 """ |
2526 | |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2527 if self._adding_group: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2528 raise error.ProgrammingError(b'cannot nest addgroup() calls') |
40671
e9293c5f8bb9
revlog: automatically read from opened file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40670
diff
changeset
|
2529 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2530 self._adding_group = True |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2531 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
|
2532 try: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2533 with self._writing(transaction): |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2534 deltacomputer = deltautil.deltacomputer(self) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2535 # loop through our set of deltas |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2536 for data in deltas: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2537 ( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2538 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2539 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2540 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2541 linknode, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2542 deltabase, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2543 delta, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2544 flags, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2545 sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2546 ) = data |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2547 link = linkmapper(linknode) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2548 flags = flags or REVIDX_DEFAULT_FLAGS |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2549 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2550 rev = self.index.get_rev(node) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2551 if rev is not None: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2552 # this can happen if two branches make the same change |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2553 self._nodeduplicatecallback(transaction, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2554 if duplicaterevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2555 duplicaterevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2556 empty = False |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2557 continue |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2558 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2559 for p in (p1, p2): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2560 if not self.index.has_node(p): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2561 raise error.LookupError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2562 p, self.radix, _(b'unknown parent') |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2563 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2564 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2565 if not self.index.has_node(deltabase): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2566 raise error.LookupError( |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2567 deltabase, self.display_id, _(b'unknown delta base') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2568 ) |
24120
a450e0a2ba0a
revlog: in addgroup, reject ill-formed deltas based on censored nodes
Mike Edgar <adgar@google.com>
parents:
24118
diff
changeset
|
2569 |
47223
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2570 baserev = self.rev(deltabase) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2571 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2572 if baserev != nullrev and self.iscensored(baserev): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2573 # if base is censored, delta must be full replacement in a |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2574 # single patch operation |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2575 hlen = struct.calcsize(b">lll") |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2576 oldlen = self.rawsize(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2577 newlen = len(delta) - hlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2578 if delta[:hlen] != mdiff.replacediffheader( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2579 oldlen, newlen |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2580 ): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2581 raise error.CensoredBaseError( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2582 self.display_id, self.node(baserev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2583 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2584 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2585 if not flags and self._peek_iscensored(baserev, delta): |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2586 flags |= REVIDX_ISCENSORED |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2587 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2588 # We assume consumers of addrevisioncb will want to retrieve |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2589 # the added revision, which will require a call to |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2590 # revision(). revision() will fast path if there is a cache |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2591 # hit. So, we tell _addrevision() to always cache in this case. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2592 # We're only using addgroup() in the context of changegroup |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2593 # generation so the revision data can always be handled as raw |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2594 # by the flagprocessor. |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2595 rev = self._addrevision( |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2596 node, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2597 None, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2598 transaction, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2599 link, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2600 p1, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2601 p2, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2602 flags, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2603 (baserev, delta), |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2604 alwayscache=alwayscache, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2605 deltacomputer=deltacomputer, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2606 sidedata=sidedata, |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2607 ) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2608 |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2609 if addrevisioncb: |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2610 addrevisioncb(self, rev) |
0cf537d85f4c
revlog: preindent some code in addgroup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47190
diff
changeset
|
2611 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
|
2612 finally: |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2613 self._adding_group = False |
45811
a5206e71c536
revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents:
45802
diff
changeset
|
2614 return not empty |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
2615 |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
2616 def iscensored(self, rev): |
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
2617 """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
|
2618 if not self._censorable: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2619 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2620 |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2621 return self.flags(rev) & REVIDX_ISCENSORED |
24118
76f6ae06ddf5
revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents:
24030
diff
changeset
|
2622 |
47180
c9ae2e7fe154
revlog: drop `flush` parameter from `_peek_iscensored`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47179
diff
changeset
|
2623 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
|
2624 """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
|
2625 if not self._censorable: |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2626 return False |
65250a66b55c
revlog: move censor logic into main revlog class
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37442
diff
changeset
|
2627 |
40325
b0fbd1792e2d
storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40298
diff
changeset
|
2628 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
|
2629 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
2630 def getstrippoint(self, minlink): |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
2631 """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
|
2632 |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
2633 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
|
2634 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
|
2635 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2636 return storageutil.resolvestripinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2637 minlink, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2638 len(self) - 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2639 self.headrevs(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2640 self.linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2641 self.parentrevs, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2642 ) |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
2643 |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8017
diff
changeset
|
2644 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
|
2645 """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
|
2646 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
2647 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
|
2648 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
|
2649 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
2650 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
|
2651 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
|
2652 strip. |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
2653 |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
2654 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
|
2655 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
|
2656 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
|
2657 """ |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2658 if len(self) == 0: |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2659 return |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2660 |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
2661 rev, _ = self.getstrippoint(minlink) |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
20073
diff
changeset
|
2662 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
|
2663 return |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2664 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2665 # first truncate the files on disk |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2666 end = self.start(rev) |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
2667 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2668 transaction.add(self._datafile, 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
|
2669 end = rev * self.index.entry_size |
2073 | 2670 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
|
2671 end += rev * self.index.entry_size |
2072 | 2672 |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2673 transaction.add(self._indexfile, end) |
47249
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2674 if self._docket is not None: |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2675 # XXX we could, leverage the docket while stripping. However it is |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2676 # not powerfull enough at the time of this comment |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2677 self._docket.index_end = end |
6597255a4f94
revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
2678 self._docket.write(transaction, stripping=True) |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2679 |
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2680 # then reset internal state in memory to forget those revisions |
40053
55db747a21ad
revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40011
diff
changeset
|
2681 self._revisioncache = None |
45802
8719a5b68419
revlog: use LRU for the chain cache
Joerg Sonnenberger <joerg@bec.de>
parents:
45735
diff
changeset
|
2682 self._chaininfocache = util.lrucachedict(500) |
8650
ef393d6ec030
revlog: refactor chunk cache interface again
Matt Mackall <mpm@selenic.com>
parents:
8643
diff
changeset
|
2683 self._chunkclear() |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2684 |
4979
06abdaf78788
revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents:
4978
diff
changeset
|
2685 del self.index[rev:-1] |
1535
7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
mason@suse.com
parents:
1533
diff
changeset
|
2686 |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
2687 def checksize(self): |
41877
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2688 """Check size of index and data files |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2689 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2690 return a (dd, di) tuple. |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2691 - dd: extra bytes for the "data" file |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2692 - di: extra bytes for the "index" file |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2693 |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2694 A healthy revlog will return (0, 0). |
3f3f962457b2
revlog: add some documentation to the `checksize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41862
diff
changeset
|
2695 """ |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1469
diff
changeset
|
2696 expected = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2697 if len(self): |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2698 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
|
2699 |
1494
249ca10d37f4
Handle empty logs in repo.checksize
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
2700 try: |
36011
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
36010
diff
changeset
|
2701 with self._datafp() as f: |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
2702 f.seek(0, io.SEEK_END) |
36011
82afb1a5ed94
revlog: use context manager for data file lifetime in checksize
Boris Feld <boris.feld@octobus.net>
parents:
36010
diff
changeset
|
2703 actual = f.tell() |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2704 dd = actual - expected |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25459
diff
changeset
|
2705 except IOError as inst: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2706 if inst.errno != errno.ENOENT: |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2707 raise |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2708 dd = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2709 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2710 try: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2711 f = self.opener(self._indexfile) |
42567
4eaf7197a740
cleanup: use named constants for second arg to .seek()
Augie Fackler <augie@google.com>
parents:
42478
diff
changeset
|
2712 f.seek(0, io.SEEK_END) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2713 actual = f.tell() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13284
diff
changeset
|
2714 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
|
2715 s = self.index.entry_size |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8658
diff
changeset
|
2716 i = max(0, actual // s) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2717 di = actual - (i * s) |
4982
9672e3c42b0c
revlog: change _inline from a function to a variable
Matt Mackall <mpm@selenic.com>
parents:
4981
diff
changeset
|
2718 if self._inline: |
2073 | 2719 databytes = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2720 for r in self: |
5312
fb070713ff36
revlog: more robust for damaged indexes
Matt Mackall <mpm@selenic.com>
parents:
5007
diff
changeset
|
2721 databytes += max(0, self.length(r)) |
2073 | 2722 dd = 0 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6703
diff
changeset
|
2723 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
|
2724 except IOError as inst: |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2725 if inst.errno != errno.ENOENT: |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2726 raise |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2727 di = 0 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2728 |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1660
diff
changeset
|
2729 return (dd, di) |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
2730 |
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
2731 def files(self): |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
2732 res = [self._indexfile] |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
2733 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
2734 res.append(self._datafile) |
6891
22cb82433842
revlog: add files method
Adrian Buehlmann <adrian@cadifra.com>
parents:
6872
diff
changeset
|
2735 return res |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2736 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2737 def emitrevisions( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2738 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2739 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2740 nodesorder=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2741 revisiondata=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2742 assumehaveparentrevisions=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2743 deltamode=repository.CG_DELTAMODE_STD, |
46728
45f0d5297698
changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46725
diff
changeset
|
2744 sidedata_helpers=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2745 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2746 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
|
2747 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2748 b'unhandled value for nodesorder: %s' % nodesorder |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2749 ) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
2750 |
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
2751 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
|
2752 nodesorder = b'storage' |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
2753 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2754 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2755 not self._storedeltachains |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2756 and deltamode != repository.CG_DELTAMODE_PREV |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2757 ): |
40495
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
2758 deltamode = repository.CG_DELTAMODE_FULL |
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
2759 |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2760 return storageutil.emitrevisions( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2761 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2762 nodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2763 nodesorder, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2764 revlogrevisiondelta, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2765 deltaparentfn=self.deltaparent, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2766 candeltafn=self.candelta, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2767 rawsizefn=self.rawsize, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2768 revdifffn=self.revdiff, |
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2769 flagsfn=self.flags, |
40495
59a870a4ad6e
changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents:
40325
diff
changeset
|
2770 deltamode=deltamode, |
40009
842ffcf1d42f
storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40005
diff
changeset
|
2771 revisiondata=revisiondata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2772 assumehaveparentrevisions=assumehaveparentrevisions, |
46728
45f0d5297698
changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46725
diff
changeset
|
2773 sidedata_helpers=sidedata_helpers, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2774 ) |
39867
5a9ab91e0a45
revlog: new API to emit revision data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
2775 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2776 DELTAREUSEALWAYS = b'always' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2777 DELTAREUSESAMEREVS = b'samerevs' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2778 DELTAREUSENEVER = b'never' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2779 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2780 DELTAREUSEFULLADD = b'fulladd' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2781 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2782 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
|
2783 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2784 def clone( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2785 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2786 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2787 destrevlog, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2788 addrevisioncb=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2789 deltareuse=DELTAREUSESAMEREVS, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2790 forcedeltabothparents=None, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2791 sidedata_helpers=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2792 ): |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2793 """Copy this revlog to another, possibly with format changes. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2794 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2795 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
|
2796 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
|
2797 differences. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2798 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2799 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
|
2800 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
|
2801 following values: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2802 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2803 DELTAREUSEALWAYS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2804 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
|
2805 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
|
2806 fastest mode of operation. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2807 DELTAREUSESAMEREVS |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2808 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
|
2809 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
|
2810 and optimization. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2811 DELTAREUSENEVER |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2812 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
|
2813 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
|
2814 algorithm changes). |
42999
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
2815 DELTAREUSEFULLADD |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
2816 Revision will be re-added as if their were new content. This is |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
2817 slower than DELTAREUSEALWAYS but allow more mechanism to kicks in. |
6510c7830838
upgrade: document DELTAREUSEFULLADD in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42998
diff
changeset
|
2818 eg: large file detection and handling. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2819 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2820 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
|
2821 significantly affect run time. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2822 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2823 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2824 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
|
2825 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
|
2826 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
|
2827 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
|
2828 revision. |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2829 |
40855
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
2830 In addition to the delta policy, the ``forcedeltabothparents`` |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
2831 argument controls whether to force compute deltas against both parents |
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
2832 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
|
2833 |
47100
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47099
diff
changeset
|
2834 See `revlogutil.sidedata.get_sidedata_helpers` for the doc on |
8bd769b5c941
sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47099
diff
changeset
|
2835 `sidedata_helpers`. |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2836 """ |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2837 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
|
2838 raise ValueError( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2839 _(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
|
2840 ) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2841 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2842 if len(destrevlog): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2843 raise ValueError(_(b'destination revlog is not empty')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2844 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2845 if getattr(self, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2846 raise ValueError(_(b'source revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2847 if getattr(destrevlog, 'filteredrevs', None): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2848 raise ValueError(_(b'destination revlog has filtered revisions')) |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2849 |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2850 # lazydelta and lazydeltabase controls whether to reuse a cached delta, |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2851 # if possible. |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2852 oldlazydelta = destrevlog._lazydelta |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2853 oldlazydeltabase = destrevlog._lazydeltabase |
38736
93777d16a25d
aggressivemergedeltas: rename variable internally
Boris Feld <boris.feld@octobus.net>
parents:
38718
diff
changeset
|
2854 oldamd = destrevlog._deltabothparents |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2855 |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2856 try: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2857 if deltareuse == self.DELTAREUSEALWAYS: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2858 destrevlog._lazydeltabase = True |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2859 destrevlog._lazydelta = True |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2860 elif deltareuse == self.DELTAREUSESAMEREVS: |
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2861 destrevlog._lazydeltabase = False |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2862 destrevlog._lazydelta = True |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2863 elif deltareuse == self.DELTAREUSENEVER: |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2864 destrevlog._lazydeltabase = False |
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2865 destrevlog._lazydelta = False |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2866 |
40855
64051af15596
upgrade: clarify "aggressivemergedelta" handling
Boris Feld <boris.feld@octobus.net>
parents:
40772
diff
changeset
|
2867 destrevlog._deltabothparents = forcedeltabothparents or oldamd |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2868 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2869 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
|
2870 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
|
2871 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
|
2872 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
|
2873 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
|
2874 forcedeltabothparents, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2875 sidedata_helpers, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2876 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2877 |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2878 finally: |
41862
afd37ed731f1
revlog: preserve `_lazydelta` attribute in `revlog.clone`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41824
diff
changeset
|
2879 destrevlog._lazydelta = oldlazydelta |
30778
1c7368d1a25f
revlog: add clone method
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30746
diff
changeset
|
2880 destrevlog._lazydeltabase = oldlazydeltabase |
38736
93777d16a25d
aggressivemergedeltas: rename variable internally
Boris Feld <boris.feld@octobus.net>
parents:
38718
diff
changeset
|
2881 destrevlog._deltabothparents = oldamd |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
2882 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2883 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
|
2884 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
|
2885 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
|
2886 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
|
2887 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
|
2888 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
|
2889 forcedeltabothparents, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2890 sidedata_helpers, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2891 ): |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2892 """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:
42997
diff
changeset
|
2893 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:
42997
diff
changeset
|
2894 index = self.index |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2895 for rev in self: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2896 entry = index[rev] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2897 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2898 # Some classes override linkrev to take filtered revs into |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2899 # account. Use raw entry from index. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2900 flags = entry[0] & 0xFFFF |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2901 linkrev = entry[4] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2902 p1 = index[entry[5]][7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2903 p2 = index[entry[6]][7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2904 node = entry[7] |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2905 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2906 # (Possibly) reuse the delta from the revlog if allowed and |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2907 # the revlog chunk is a delta. |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2908 cachedelta = None |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2909 rawtext = None |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2910 if deltareuse == self.DELTAREUSEFULLADD: |
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
|
2911 text, sidedata = self._revisiondata(rev) |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2912 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2913 if sidedata_helpers is not None: |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47098
diff
changeset
|
2914 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2915 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2916 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2917 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
|
2918 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2919 destrevlog.addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2920 text, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2921 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2922 linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2923 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2924 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2925 cachedelta=cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2926 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2927 flags=flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2928 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
|
2929 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2930 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2931 else: |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2932 if destrevlog._lazydelta: |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2933 dp = self.deltaparent(rev) |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2934 if dp != nullrev: |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2935 cachedelta = (dp, bytes(self._chunk(rev))) |
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2936 |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2937 sidedata = None |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2938 if not cachedelta: |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2939 rawtext, sidedata = self._revisiondata(rev) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2940 if sidedata is None: |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2941 sidedata = self.sidedata(rev) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2942 |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2943 if sidedata_helpers is not None: |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47098
diff
changeset
|
2944 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers( |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2945 self, sidedata_helpers, sidedata, rev |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2946 ) |
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2947 flags = flags | new_flags[0] & ~new_flags[1] |
43000
8a31294fa25c
upgrade: fix DELTAREUSEFULLADD implementation in revlog.clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42999
diff
changeset
|
2948 |
47225
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47224
diff
changeset
|
2949 with destrevlog._writing(tr): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2950 destrevlog._addrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2951 node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2952 rawtext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2953 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2954 linkrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2955 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2956 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2957 flags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2958 cachedelta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2959 deltacomputer=deltacomputer, |
47098
27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47095
diff
changeset
|
2960 sidedata=sidedata, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2961 ) |
42998
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2962 |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2963 if addrevisioncb: |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2964 addrevisioncb(self, rev, node) |
4f2315cce1db
upgrade: move most of revlog.clone method into a _clone method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42997
diff
changeset
|
2965 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2966 def censorrevision(self, tr, censornode, tombstone=b''): |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2967 if self._format_version == REVLOGV0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2968 raise error.RevlogError( |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2969 _(b'cannot censor with version %d revlogs') |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2970 % self._format_version |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2971 ) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
2972 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2973 censorrev = self.rev(censornode) |
39883
3e896b51aa5d
storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39882
diff
changeset
|
2974 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
2975 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2976 if len(tombstone) > self.rawsize(censorrev): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2977 raise error.Abort( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
2978 _(b'censor tombstone must be no longer than censored data') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
2979 ) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
2980 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2981 # Rewriting the revlog in place is hard. Our strategy for censoring is |
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2982 # to create a new revlog, copy all revisions to it, then replace the |
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2983 # revlogs on transaction close. |
47159
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
2984 # |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2985 # This is a bit dangerous. We could easily have a mismatch of state. |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
2986 newrl = revlog( |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
2987 self.opener, |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
2988 target=self.target, |
47164
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47163
diff
changeset
|
2989 radix=self.radix, |
47159
c6b8d5d91e73
revlog: deal with special "postfix" explicitely
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47158
diff
changeset
|
2990 postfix=b'tmpcensored', |
47089
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
2991 censorable=True, |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47082
diff
changeset
|
2992 ) |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2993 newrl._format_version = self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
2994 newrl._format_flags = self._format_flags |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2995 newrl._generaldelta = self._generaldelta |
47077
5e64c93d5f94
revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
2996 newrl._parse_index = self._parse_index |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
2997 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2998 for rev in self.revs(): |
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
2999 node = self.node(rev) |
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3000 p1, p2 = self.parents(node) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3001 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3002 if rev == censorrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3003 newrl.addrawrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3004 tombstone, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3005 tr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3006 self.linkrev(censorrev), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3007 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3008 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3009 censornode, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3010 REVIDX_ISCENSORED, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3011 ) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3012 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3013 if newrl.deltaparent(rev) != nullrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3014 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3015 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3016 b'censored revision stored as delta; ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3017 b'cannot censor' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3018 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3019 hint=_( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3020 b'censoring of revlogs is not ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3021 b'fully implemented; please report ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3022 b'this bug' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3023 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3024 ) |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3025 continue |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3026 |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3027 if self.iscensored(rev): |
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3028 if self.deltaparent(rev) != nullrev: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3029 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3030 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3031 b'cannot censor due to censored ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3032 b'revision having delta stored' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3033 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3034 ) |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3035 rawtext = self._chunk(rev) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3036 else: |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3037 rawtext = self.rawdata(rev) |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3038 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3039 newrl.addrawrevision( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3040 rawtext, tr, self.linkrev(rev), p1, p2, node, self.flags(rev) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3041 ) |
39794
a6b3c4c1019f
revlog: move censor logic out of censor extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39791
diff
changeset
|
3042 |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3043 tr.addbackup(self._indexfile, location=b'store') |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3044 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3045 tr.addbackup(self._datafile, location=b'store') |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3046 |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3047 self.opener.rename(newrl._indexfile, self._indexfile) |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3048 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3049 self.opener.rename(newrl._datafile, self._datafile) |
40057
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3050 |
324b4b10351e
revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40056
diff
changeset
|
3051 self.clearcaches() |
41204
e3cfe0702eac
revlog: inline opener options logic into _loadindex()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41203
diff
changeset
|
3052 self._loadindex() |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3053 |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3054 def verifyintegrity(self, state): |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3055 """Verifies the integrity of the revlog. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3056 |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3057 Yields ``revlogproblem`` instances describing problems that are |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3058 found. |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3059 """ |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3060 dd, di = self.checksize() |
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3061 if dd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3062 yield revlogproblem(error=_(b'data length off by %d bytes') % dd) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3063 if di: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3064 yield revlogproblem(error=_(b'index contains %d extra bytes') % di) |
39847
97986c9c69d3
verify: start to abstract file verification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39836
diff
changeset
|
3065 |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3066 version = self._format_version |
39850
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
3067 |
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
3068 # 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
|
3069 if version != state[b'expectedversion']: |
39850
e6d3d39cc1c7
revlog: use proper version comparison during verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
3070 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3071 warning=_(b"warning: '%s' uses revlog format %d; expected %d") |
47171
3a9f3470922c
revlog: use revlog.display_id in format related errors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47169
diff
changeset
|
3072 % (self.display_id, version, state[b'expectedversion']) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3073 ) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3074 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3075 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
|
3076 state[b'safe_renamed'] = set() |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3077 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3078 for rev in self: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3079 node = self.node(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3080 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3081 # Verify contents. 4 cases to care about: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3082 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3083 # common: the most common case |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3084 # rename: with a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3085 # meta: file content starts with b'\1\n', the metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3086 # header defined in filelog.py, but without a rename |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3087 # ext: content stored externally |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3088 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3089 # More formally, their differences are shown below: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3090 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3091 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3092 # ------------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3093 # flags() | 0 | 0 | 0 | not 0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3094 # renamed() | False | True | False | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3095 # rawtext[0:2]=='\1\n'| False | True | True | ? |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3096 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3097 # "rawtext" means the raw text stored in revlog data, which |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3098 # could be retrieved by "rawdata(rev)". "text" |
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3099 # mentioned below is "revision(rev)". |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3100 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3101 # There are 3 different lengths stored physically: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3102 # 1. L1: rawsize, stored in revlog index |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3103 # 2. L2: len(rawtext), stored in revlog data |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3104 # 3. L3: len(text), stored in revlog data if flags==0, or |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3105 # possibly somewhere else if flags!=0 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3106 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3107 # L1 should be equal to L2. L3 could be different from them. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3108 # "text" may or may not affect commit hash depending on flag |
42749
6d61be152c55
flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42748
diff
changeset
|
3109 # processors (see flagutil.addflagprocessor). |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3110 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3111 # | common | rename | meta | ext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3112 # ------------------------------------------------- |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3113 # rawsize() | L1 | L1 | L1 | L1 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3114 # size() | L1 | L2-LM | L1(*) | L1 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3115 # len(rawtext) | L2 | L2 | L2 | L2 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3116 # len(text) | L2 | L2 | L2 | L3 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3117 # len(read()) | L2 | L2-LM | L2-LM | L3 (?) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3118 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3119 # LM: length of metadata, depending on rawtext |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3120 # (*): not ideal, see comment in filelog.size |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3121 # (?): could be "- len(meta)" if the resolved content has |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3122 # rename metadata |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3123 # |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3124 # Checks needed to be done: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3125 # 1. length check: L1 == L2, in all cases. |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3126 # 2. hash check: depending on flag processor, we may need to |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3127 # use either "text" (external), or "rawtext" (in revlog). |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3128 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3129 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3130 skipflags = state.get(b'skipflags', 0) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3131 if skipflags: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3132 skipflags &= self.flags(rev) |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3133 |
43962
7c3118b9a9db
revlog: split the content verification of a node into a separate method
Matt Harbison <matt_harbison@yahoo.com>
parents:
43799
diff
changeset
|
3134 _verify_revision(self, skipflags, state, node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3135 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3136 l1 = self.rawsize(rev) |
42784
5a8f2c8edff6
rawdata: update caller in revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42749
diff
changeset
|
3137 l2 = len(self.rawdata(node)) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3138 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3139 if l1 != l2: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3140 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3141 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
|
3142 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3143 ) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3144 |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3145 except error.CensoredNodeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3146 if state[b'erroroncensored']: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3147 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3148 error=_(b'censored file data'), node=node |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3149 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3150 state[b'skipread'].add(node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3151 except Exception as e: |
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3152 yield revlogproblem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3153 error=_(b'unpacking %s: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3154 % (short(node), stringutil.forcebytestr(e)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3155 node=node, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3156 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3157 state[b'skipread'].add(node) |
39877
733db72f0f54
revlog: move revision verification out of verify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39874
diff
changeset
|
3158 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3159 def storageinfo( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3160 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3161 exclusivefiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3162 sharedfiles=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3163 revisionscount=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3164 trackedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3165 storedsize=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3166 ): |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3167 d = {} |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3168 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3169 if exclusivefiles: |
47162
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47159
diff
changeset
|
3170 d[b'exclusivefiles'] = [(self.opener, self._indexfile)] |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3171 if not self._inline: |
47163
396442cd7e6a
revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47162
diff
changeset
|
3172 d[b'exclusivefiles'].append((self.opener, self._datafile)) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3173 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3174 if sharedfiles: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3175 d[b'sharedfiles'] = [] |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3176 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3177 if revisionscount: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3178 d[b'revisionscount'] = len(self) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3179 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3180 if trackedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3181 d[b'trackedsize'] = sum(map(self.rawsize, iter(self))) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3182 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3183 if storedsize: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3184 d[b'storedsize'] = sum( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43039
diff
changeset
|
3185 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
|
3186 ) |
39874
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3187 |
14e500b58263
revlog: add method for obtaining storage info (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39871
diff
changeset
|
3188 return d |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3189 |
47227
2bd4b5218918
revlog: pass a transaction object to `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47226
diff
changeset
|
3190 def rewrite_sidedata(self, transaction, helpers, startrev, endrev): |
47150
84b176ad2860
revlog: replace REVLOGV2 check related to sidedata with `hassidedata` checks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
3191 if not self.hassidedata: |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3192 return |
47245
616b8f412676
revlogv2: introduce a very basic docket file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47242
diff
changeset
|
3193 # revlog formats with sidedata support does not support inline |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3194 assert not self._inline |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3195 if not helpers[1] and not helpers[2]: |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3196 # Nothing to generate or remove |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3197 return |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3198 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3199 new_entries = [] |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3200 # append the new sidedata |
47229
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
3201 with self._writing(transaction): |
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
3202 ifh, dfh = self._writinghandles |
47226
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47225
diff
changeset
|
3203 dfh.seek(0, os.SEEK_END) |
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47225
diff
changeset
|
3204 current_offset = dfh.tell() |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3205 for rev in range(startrev, endrev + 1): |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3206 entry = self.index[rev] |
47099
3aab2330b7d3
sidedata: move sidedata-related utils to the dedicated module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47098
diff
changeset
|
3207 new_sidedata, flags = sidedatautil.run_sidedata_helpers( |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3208 store=self, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3209 sidedata_helpers=helpers, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3210 sidedata={}, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3211 rev=rev, |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3212 ) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3213 |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3214 serialized_sidedata = sidedatautil.serialize_sidedata( |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3215 new_sidedata |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3216 ) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3217 if entry[8] != 0 or entry[9] != 0: |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3218 # rewriting entries that already have sidedata is not |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3219 # supported yet, because it introduces garbage data in the |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3220 # revlog. |
47239
e51392acd70c
revlog: fix capitalisation of an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47233
diff
changeset
|
3221 msg = b"rewriting existing sidedata is not supported yet" |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3222 raise error.Abort(msg) |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3223 |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3224 # Apply (potential) flags to add and to remove after running |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3225 # the sidedata helpers |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3226 new_offset_flags = entry[0] | flags[0] & ~flags[1] |
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3227 entry = (new_offset_flags,) + entry[1:8] |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3228 entry += (current_offset, len(serialized_sidedata)) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3229 |
47228
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
3230 # the sidedata computation might have move the file cursors around |
8f6165c90163
revlog: open files in 'r+' instead of 'a+'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47227
diff
changeset
|
3231 dfh.seek(current_offset, os.SEEK_SET) |
47226
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47225
diff
changeset
|
3232 dfh.write(serialized_sidedata) |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3233 new_entries.append(entry) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3234 current_offset += len(serialized_sidedata) |
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3235 |
47229
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
3236 # rewrite the new index entries |
b3acefded601
revlog: use `_writing` in `rewrite_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47228
diff
changeset
|
3237 ifh.seek(startrev * self.index.entry_size) |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3238 for i, e in enumerate(new_entries): |
46731
ba8e508a8e69
sidedata-exchange: rewrite sidedata on-the-fly whenever possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46729
diff
changeset
|
3239 rev = startrev + i |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47094
diff
changeset
|
3240 self.index.replace_sidedata_info(rev, e[8], e[9], e[0]) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
3241 packed = self.index.entry_binary(rev) |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47245
diff
changeset
|
3242 if rev == 0 and self._docket is None: |
47153
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3243 header = self._format_flags | self._format_version |
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
3244 header = self.index.pack_header(header) |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47077
diff
changeset
|
3245 packed = header + packed |
47226
042388bba644
revlog: rename variable in `rewrite_sidedata` to match other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47225
diff
changeset
|
3246 ifh.write(packed) |