Mercurial > hg
annotate mercurial/pure/parsers.py @ 48222:7e78c72ee3ea
dirstate-v2: Initial Python serializer
This adds code seralizing a `map` and `copy_map` dicts into dirstate-v2
file formate. This is not used yet.
Differential Revision: https://phab.mercurial-scm.org/D11519
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Thu, 22 Jul 2021 17:31:37 +0200 |
parents | a32a96079e2d |
children | db5897321351 |
rev | line source |
---|---|
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
1 # parsers.py - Python implementation of parsers.c |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46717
diff
changeset
|
3 # Copyright 2009 Olivia Mackall <olivia@selenic.com> and others |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
7945
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. |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
7 |
27339
6ab8c6511a6a
parsers: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24634
diff
changeset
|
8 from __future__ import absolute_import |
6ab8c6511a6a
parsers: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24634
diff
changeset
|
9 |
48221
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
10 import stat |
27339
6ab8c6511a6a
parsers: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24634
diff
changeset
|
11 import struct |
6ab8c6511a6a
parsers: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24634
diff
changeset
|
12 import zlib |
6ab8c6511a6a
parsers: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24634
diff
changeset
|
13 |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
14 from ..node import ( |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
15 nullrev, |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
16 sha1nodeconstants, |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
17 ) |
47566
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
18 from ..thirdparty import attr |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
19 from .. import ( |
47235
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
20 error, |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
21 pycompat, |
47394
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
22 revlogutils, |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
23 util, |
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
24 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
25 |
44034
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43619
diff
changeset
|
26 from ..revlogutils import nodemap as nodemaputil |
46857
cc65cea90edb
revlog: move the details of revlog "v1" index inside revlog.utils.constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
27 from ..revlogutils import constants as revlog_constants |
44034
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43619
diff
changeset
|
28 |
36958
644a02f6b34f
util: prefer "bytesio" to "stringio"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34331
diff
changeset
|
29 stringio = pycompat.bytesio |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
30 |
31220
37596c980662
parsers: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29133
diff
changeset
|
31 |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
32 _pack = struct.pack |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
33 _unpack = struct.unpack |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
34 _compress = zlib.compress |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
35 _decompress = zlib.decompress |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
36 |
47507
d4c795576aeb
dirstate-entry: turn dirstate tuple into a real object (like in C)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47490
diff
changeset
|
37 |
47514
559aee84b889
dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47513
diff
changeset
|
38 # a special value used internally for `size` if the file come from the other parent |
559aee84b889
dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47513
diff
changeset
|
39 FROM_P2 = -2 |
559aee84b889
dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47513
diff
changeset
|
40 |
47516
b8ffe85e399b
dirstate-entry: `merged_removed` and `from_p2_removed` properties
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47515
diff
changeset
|
41 # a special value used internally for `size` if the file is modified/merged/added |
b8ffe85e399b
dirstate-entry: `merged_removed` and `from_p2_removed` properties
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47515
diff
changeset
|
42 NONNORMAL = -1 |
b8ffe85e399b
dirstate-entry: `merged_removed` and `from_p2_removed` properties
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47515
diff
changeset
|
43 |
47540
1a6302427eb9
dirstate-item: use need_delay when packing dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47539
diff
changeset
|
44 # a special value used internally for `time` if the time is ambigeous |
1a6302427eb9
dirstate-item: use need_delay when packing dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47539
diff
changeset
|
45 AMBIGUOUS_TIME = -1 |
1a6302427eb9
dirstate-item: use need_delay when packing dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47539
diff
changeset
|
46 |
48221
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
47 # Bits of the `flags` byte inside a node in the file format |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
48 DIRSTATE_V2_WDIR_TRACKED = 1 << 0 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
49 DIRSTATE_V2_P1_TRACKED = 1 << 1 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
50 DIRSTATE_V2_P2_INFO = 1 << 2 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
51 DIRSTATE_V2_HAS_MODE_AND_SIZE = 1 << 3 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
52 DIRSTATE_V2_HAS_MTIME = 1 << 4 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
53 DIRSTATE_V2_MODE_EXEC_PERM = 1 << 5 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
54 DIRSTATE_V2_MODE_IS_SYMLINK = 1 << 6 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
55 |
47514
559aee84b889
dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47513
diff
changeset
|
56 |
47664
119b9c8db94d
dirstate-item: use an explicit __init__ function instead of the attrs one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47569
diff
changeset
|
57 @attr.s(slots=True, init=False) |
47539
84391ddf4c78
dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47538
diff
changeset
|
58 class DirstateItem(object): |
47507
d4c795576aeb
dirstate-entry: turn dirstate tuple into a real object (like in C)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47490
diff
changeset
|
59 """represent a dirstate entry |
d4c795576aeb
dirstate-entry: turn dirstate tuple into a real object (like in C)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47490
diff
changeset
|
60 |
48112
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
61 It hold multiple attributes |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
62 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
63 # about file tracking |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
64 - wc_tracked: is the file tracked by the working copy |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
65 - p1_tracked: is the file tracked in working copy first parent |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
66 - p2_info: the file has been involved in some merge operation. Either |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
67 because it was actually merged, or because the p2 version was |
48188
77fc340acad7
dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents:
48164
diff
changeset
|
68 ahead, or because some rename moved it there. In either case |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
69 `hg status` will want it displayed as modified. |
48112
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
70 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
71 # about the file state expected from p1 manifest: |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
72 - mode: the file mode in p1 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
73 - size: the file size in p1 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
74 |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
75 These value can be set to None, which mean we don't have a meaningful value |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
76 to compare with. Either because we don't really care about them as there |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
77 `status` is known without having to look at the disk or because we don't |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
78 know these right now and a full comparison will be needed to find out if |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
79 the file is clean. |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
80 |
48112
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
81 # about the file state on disk last time we saw it: |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
82 - mtime: the last known clean mtime for the file. |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48111
diff
changeset
|
83 |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
84 This value can be set to None if no cachable state exist. Either because we |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
85 do not care (see previous section) or because we could not cache something |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
86 yet. |
47490
084ed6a7c6fd
dirstate: document the dirstatetuple content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
87 """ |
084ed6a7c6fd
dirstate: document the dirstatetuple content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47394
diff
changeset
|
88 |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
89 _wc_tracked = attr.ib() |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
90 _p1_tracked = attr.ib() |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
91 _p2_info = attr.ib() |
47566
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
92 _mode = attr.ib() |
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
93 _size = attr.ib() |
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
94 _mtime = attr.ib() |
47507
d4c795576aeb
dirstate-entry: turn dirstate tuple into a real object (like in C)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47490
diff
changeset
|
95 |
47895
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
96 def __init__( |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
97 self, |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
98 wc_tracked=False, |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
99 p1_tracked=False, |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
100 p2_info=False, |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
101 has_meaningful_data=True, |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
102 has_meaningful_mtime=True, |
47895
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
103 parentfiledata=None, |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
104 ): |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
105 self._wc_tracked = wc_tracked |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
106 self._p1_tracked = p1_tracked |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
107 self._p2_info = p2_info |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
108 |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
109 self._mode = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
110 self._size = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
111 self._mtime = None |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
112 if parentfiledata is None: |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
113 has_meaningful_mtime = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
114 has_meaningful_data = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
115 if has_meaningful_data: |
47895
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
116 self._mode = parentfiledata[0] |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
117 self._size = parentfiledata[1] |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
118 if has_meaningful_mtime: |
47895
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47890
diff
changeset
|
119 self._mtime = parentfiledata[2] |
47664
119b9c8db94d
dirstate-item: use an explicit __init__ function instead of the attrs one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47569
diff
changeset
|
120 |
47665
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
121 @classmethod |
48221
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
122 def from_v2_data(cls, flags, size, mtime): |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
123 """Build a new DirstateItem object from V2 data""" |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
124 has_mode_size = bool(flags & DIRSTATE_V2_HAS_MODE_AND_SIZE) |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
125 mode = None |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
126 if has_mode_size: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
127 assert stat.S_IXUSR == 0o100 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
128 if flags & DIRSTATE_V2_MODE_EXEC_PERM: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
129 mode = 0o755 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
130 else: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
131 mode = 0o644 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
132 if flags & DIRSTATE_V2_MODE_IS_SYMLINK: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
133 mode |= stat.S_IFLNK |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
134 else: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
135 mode |= stat.S_IFREG |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
136 return cls( |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
137 wc_tracked=bool(flags & DIRSTATE_V2_WDIR_TRACKED), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
138 p1_tracked=bool(flags & DIRSTATE_V2_P1_TRACKED), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
139 p2_info=bool(flags & DIRSTATE_V2_P2_INFO), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
140 has_meaningful_data=has_mode_size, |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
141 has_meaningful_mtime=bool(flags & DIRSTATE_V2_HAS_MTIME), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
142 parentfiledata=(mode, size, mtime), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
143 ) |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
144 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48188
diff
changeset
|
145 @classmethod |
47665
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
146 def from_v1_data(cls, state, mode, size, mtime): |
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
147 """Build a new DirstateItem object from V1 data |
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
148 |
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
149 Since the dirstate-v1 format is frozen, the signature of this function |
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
150 is not expected to change, unlike the __init__ one. |
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
151 """ |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
152 if state == b'm': |
48154
7a8c9869e4fe
dirstate-item: replace call to new_merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48153
diff
changeset
|
153 return cls(wc_tracked=True, p1_tracked=True, p2_info=True) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
154 elif state == b'a': |
48156
d342815ff827
dirstate-item: replace call to new_added
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48155
diff
changeset
|
155 return cls(wc_tracked=True) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
156 elif state == b'r': |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
157 if size == NONNORMAL: |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
158 p1_tracked = True |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
159 p2_info = True |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
160 elif size == FROM_P2: |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
161 p1_tracked = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
162 p2_info = True |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
163 else: |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
164 p1_tracked = True |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
165 p2_info = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
166 return cls(p1_tracked=p1_tracked, p2_info=p2_info) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
167 elif state == b'n': |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
168 if size == FROM_P2: |
48158
da304f78a0e1
dirstate-item: replace call to new_from_p2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48157
diff
changeset
|
169 return cls(wc_tracked=True, p2_info=True) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
170 elif size == NONNORMAL: |
48160
898de425bcd6
dirstate-item: replace call to new_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48159
diff
changeset
|
171 return cls(wc_tracked=True, p1_tracked=True) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
172 elif mtime == AMBIGUOUS_TIME: |
48162
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48161
diff
changeset
|
173 return cls( |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48161
diff
changeset
|
174 wc_tracked=True, |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48161
diff
changeset
|
175 p1_tracked=True, |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48161
diff
changeset
|
176 has_meaningful_mtime=False, |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48161
diff
changeset
|
177 parentfiledata=(mode, size, 42), |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48161
diff
changeset
|
178 ) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
179 else: |
48163
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48162
diff
changeset
|
180 return cls( |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48162
diff
changeset
|
181 wc_tracked=True, |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48162
diff
changeset
|
182 p1_tracked=True, |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48162
diff
changeset
|
183 parentfiledata=(mode, size, mtime), |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48162
diff
changeset
|
184 ) |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
185 else: |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
186 raise RuntimeError(b'unknown state: %s' % state) |
47665
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
187 |
47666
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
188 def set_possibly_dirty(self): |
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
189 """Mark a file as "possibly dirty" |
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
190 |
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
191 This means the next status call will have to actually check its content |
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
192 to make sure it is correct. |
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
193 """ |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
194 self._mtime = None |
47666
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
195 |
47974
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
196 def set_clean(self, mode, size, mtime): |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
197 """mark a file as "clean" cancelling potential "possibly dirty call" |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
198 |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
199 Note: this function is a descendant of `dirstate.normal` and is |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
200 currently expected to be call on "normal" entry only. There are not |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
201 reason for this to not change in the future as long as the ccode is |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
202 updated to preserve the proper state of the non-normal files. |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
203 """ |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
204 self._wc_tracked = True |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
205 self._p1_tracked = True |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
206 self._mode = mode |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
207 self._size = size |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
208 self._mtime = mtime |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47938
diff
changeset
|
209 |
47990
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
210 def set_tracked(self): |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
211 """mark a file as tracked in the working copy |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
212 |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
213 This will ultimately be called by command like `hg add`. |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
214 """ |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
215 self._wc_tracked = True |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
216 # `set_tracked` is replacing various `normallookup` call. So we mark |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
217 # the files as needing lookup |
47990
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
218 # |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
219 # Consider dropping this in the future in favor of something less broad. |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
220 self._mtime = None |
47990
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47974
diff
changeset
|
221 |
47890
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
222 def set_untracked(self): |
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
223 """mark a file as untracked in the working copy |
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
224 |
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
225 This will ultimately be called by command like `hg remove`. |
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
226 """ |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
227 self._wc_tracked = False |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
228 self._mode = None |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
229 self._size = None |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
230 self._mtime = None |
47890
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
231 |
48060
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
232 def drop_merge_data(self): |
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
233 """remove all "merge-only" from a DirstateItem |
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
234 |
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
235 This is to be call by the dirstatemap code when the second parent is dropped |
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
236 """ |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
237 if self._p2_info: |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
238 self._p2_info = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
239 self._mode = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
240 self._size = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
241 self._mtime = None |
48060
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
242 |
47512
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
243 @property |
47536
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
244 def mode(self): |
47926
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47925
diff
changeset
|
245 return self.v1_mode() |
47536
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
246 |
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
247 @property |
47537
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
248 def size(self): |
47926
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47925
diff
changeset
|
249 return self.v1_size() |
47537
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
250 |
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
251 @property |
47538
77fce401a2bb
dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47537
diff
changeset
|
252 def mtime(self): |
47926
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47925
diff
changeset
|
253 return self.v1_mtime() |
47538
77fce401a2bb
dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47537
diff
changeset
|
254 |
77fce401a2bb
dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47537
diff
changeset
|
255 @property |
47512
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
256 def state(self): |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
257 """ |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
258 States are: |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
259 n normal |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
260 m needs merging |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
261 r marked for removal |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
262 a marked for addition |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
263 |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
264 XXX This "state" is a bit obscure and mostly a direct expression of the |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
265 dirstatev1 format. It would make sense to ultimately deprecate it in |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
266 favor of the more "semantic" attributes. |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
267 """ |
48111
d73b42f905f8
dirstate-item: use `any_tracked` more
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48110
diff
changeset
|
268 if not self.any_tracked: |
48088
418611f18fd8
dirstate-entry: use `?` for the state of entry without any tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48087
diff
changeset
|
269 return b'?' |
47926
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47925
diff
changeset
|
270 return self.v1_state() |
47512
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
271 |
47513
10e740292dff
dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47512
diff
changeset
|
272 @property |
47531
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
273 def tracked(self): |
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
274 """True is the file is tracked in the working copy""" |
47928
f1033c2d9b66
dirstate-item: implement `tracked` in a simpler way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47927
diff
changeset
|
275 return self._wc_tracked |
47531
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
276 |
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
277 @property |
48087
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48086
diff
changeset
|
278 def any_tracked(self): |
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48086
diff
changeset
|
279 """True is the file is tracked anywhere (wc or parents)""" |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
280 return self._wc_tracked or self._p1_tracked or self._p2_info |
48087
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48086
diff
changeset
|
281 |
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48086
diff
changeset
|
282 @property |
47526
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
283 def added(self): |
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
284 """True if the file has been added""" |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
285 return self._wc_tracked and not (self._p1_tracked or self._p2_info) |
47526
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
286 |
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
287 @property |
48086
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
288 def maybe_clean(self): |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
289 """True if the file has a chance to be in the "clean" state""" |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
290 if not self._wc_tracked: |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
291 return False |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
292 elif not self._p1_tracked: |
48086
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
293 return False |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
294 elif self._p2_info: |
48086
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
295 return False |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
296 return True |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
297 |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48067
diff
changeset
|
298 @property |
48143
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48142
diff
changeset
|
299 def p1_tracked(self): |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48142
diff
changeset
|
300 """True if the file is tracked in the first parent manifest""" |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48142
diff
changeset
|
301 return self._p1_tracked |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48142
diff
changeset
|
302 |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48142
diff
changeset
|
303 @property |
48142
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
304 def p2_info(self): |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
305 """True if the file needed to merge or apply any input from p2 |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
306 |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
307 See the class documentation for details. |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
308 """ |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
309 return self._wc_tracked and self._p2_info |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
310 |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48138
diff
changeset
|
311 @property |
47515
c94d3ff46fd5
dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47514
diff
changeset
|
312 def removed(self): |
c94d3ff46fd5
dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47514
diff
changeset
|
313 """True if the file has been removed""" |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
314 return not self._wc_tracked and (self._p1_tracked or self._p2_info) |
47515
c94d3ff46fd5
dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47514
diff
changeset
|
315 |
48222
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
316 def v2_data(self): |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
317 """Returns (flags, mode, size, mtime) for v2 serialization""" |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
318 flags = 0 |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
319 if self._wc_tracked: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
320 flags |= DIRSTATE_V2_WDIR_TRACKED |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
321 if self._p1_tracked: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
322 flags |= DIRSTATE_V2_P1_TRACKED |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
323 if self._p2_info: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
324 flags |= DIRSTATE_V2_P2_INFO |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
325 if self.mode is not None and self.size is not None: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
326 flags |= DIRSTATE_V2_HAS_MODE_AND_SIZE |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
327 if self.mode & stat.S_IXUSR: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
328 flags |= DIRSTATE_V2_MODE_EXEC_PERM |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
329 if stat.S_ISLNK(self.mode): |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
330 flags |= DIRSTATE_V2_MODE_IS_SYMLINK |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
331 if self.mtime is not None: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
332 flags |= DIRSTATE_V2_HAS_MTIME |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
333 return (flags, self.size or 0, self.mtime or 0) |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents:
48221
diff
changeset
|
334 |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
335 def v1_state(self): |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
336 """return a "state" suitable for v1 serialization""" |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
337 if not self.any_tracked: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
338 # the object has no state to record, this is -currently- |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
339 # unsupported |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
340 raise RuntimeError('untracked item') |
47936
0d185f73c619
dirstate-item: implement v1_state with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47935
diff
changeset
|
341 elif self.removed: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
342 return b'r' |
48152
8f88307f8e07
dirstate-item: replace another usage of `merged`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48150
diff
changeset
|
343 elif self._p1_tracked and self._p2_info: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
344 return b'm' |
47936
0d185f73c619
dirstate-item: implement v1_state with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47935
diff
changeset
|
345 elif self.added: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
346 return b'a' |
47936
0d185f73c619
dirstate-item: implement v1_state with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47935
diff
changeset
|
347 else: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
348 return b'n' |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
349 |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
350 def v1_mode(self): |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
351 """return a "mode" suitable for v1 serialization""" |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
352 return self._mode if self._mode is not None else 0 |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
353 |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
354 def v1_size(self): |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
355 """return a "size" suitable for v1 serialization""" |
48111
d73b42f905f8
dirstate-item: use `any_tracked` more
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48110
diff
changeset
|
356 if not self.any_tracked: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
357 # the object has no state to record, this is -currently- |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
358 # unsupported |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
359 raise RuntimeError('untracked item') |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
360 elif self.removed and self._p1_tracked and self._p2_info: |
47937
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47936
diff
changeset
|
361 return NONNORMAL |
48149
6ac2b417d5d7
dirstate-item: directly use `p2_info` in `v1_size`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48143
diff
changeset
|
362 elif self._p2_info: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
363 return FROM_P2 |
47937
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47936
diff
changeset
|
364 elif self.removed: |
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47936
diff
changeset
|
365 return 0 |
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47936
diff
changeset
|
366 elif self.added: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
367 return NONNORMAL |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
368 elif self._size is None: |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
369 return NONNORMAL |
47937
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47936
diff
changeset
|
370 else: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
371 return self._size |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
372 |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
373 def v1_mtime(self): |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
374 """return a "mtime" suitable for v1 serialization""" |
48111
d73b42f905f8
dirstate-item: use `any_tracked` more
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48110
diff
changeset
|
375 if not self.any_tracked: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
376 # the object has no state to record, this is -currently- |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
377 # unsupported |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
378 raise RuntimeError('untracked item') |
47938
508394e38580
dirstate-item: implement `v1_mtime` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47937
diff
changeset
|
379 elif self.removed: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
380 return 0 |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
381 elif self._mtime is None: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
382 return AMBIGUOUS_TIME |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
383 elif self._p2_info: |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
384 return AMBIGUOUS_TIME |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
385 elif not self._p1_tracked: |
47938
508394e38580
dirstate-item: implement `v1_mtime` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47937
diff
changeset
|
386 return AMBIGUOUS_TIME |
47927
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47926
diff
changeset
|
387 else: |
48138
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48113
diff
changeset
|
388 return self._mtime |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
389 |
47532
ccbabaee5c36
dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47531
diff
changeset
|
390 def need_delay(self, now): |
ccbabaee5c36
dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47531
diff
changeset
|
391 """True if the stored mtime would be ambiguous with the current time""" |
47926
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47925
diff
changeset
|
392 return self.v1_state() == b'n' and self.v1_mtime() == now |
47532
ccbabaee5c36
dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47531
diff
changeset
|
393 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
394 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
395 def gettype(q): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
396 return int(q & 0xFFFF) |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
397 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
398 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
399 class BaseIndexObject(object): |
47268
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
400 # Can I be passed to an algorithme implemented in Rust ? |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
401 rust_ext_compat = 0 |
46635
e83327af26f1
pure-parsers: document index class constants
Raphaël Gomès <rgomes@octobus.net>
parents:
46407
diff
changeset
|
402 # Format of an index entry according to Python's `struct` language |
46860
1dc86c2a43ce
revlog: directly use the Struct object for related operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46858
diff
changeset
|
403 index_format = revlog_constants.INDEX_ENTRY_V1 |
46635
e83327af26f1
pure-parsers: document index class constants
Raphaël Gomès <rgomes@octobus.net>
parents:
46407
diff
changeset
|
404 # Size of a C unsigned long long int, platform independent |
e83327af26f1
pure-parsers: document index class constants
Raphaël Gomès <rgomes@octobus.net>
parents:
46407
diff
changeset
|
405 big_int_size = struct.calcsize(b'>Q') |
e83327af26f1
pure-parsers: document index class constants
Raphaël Gomès <rgomes@octobus.net>
parents:
46407
diff
changeset
|
406 # Size of a C long int, platform independent |
e83327af26f1
pure-parsers: document index class constants
Raphaël Gomès <rgomes@octobus.net>
parents:
46407
diff
changeset
|
407 int_size = struct.calcsize(b'>i') |
e83327af26f1
pure-parsers: document index class constants
Raphaël Gomès <rgomes@octobus.net>
parents:
46407
diff
changeset
|
408 # An empty index entry, used as a default value to be overridden, or nullrev |
47249
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
409 null_item = ( |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
410 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
411 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
412 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
413 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
414 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
415 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
416 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
417 sha1nodeconstants.nullid, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
418 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
419 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
420 revlog_constants.COMP_MODE_INLINE, |
47256
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
421 revlog_constants.COMP_MODE_INLINE, |
47249
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47244
diff
changeset
|
422 ) |
46407
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
423 |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
424 @util.propertycache |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
425 def entry_size(self): |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
426 return self.index_format.size |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
427 |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
428 @property |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
429 def nodemap(self): |
43619
c207c46a86b9
py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43574
diff
changeset
|
430 msg = b"index.nodemap is deprecated, use index.[has_node|rev|get_rev]" |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
431 util.nouideprecwarn(msg, b'5.3', stacklevel=2) |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
432 return self._nodemap |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
433 |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
434 @util.propertycache |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
435 def _nodemap(self): |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
436 nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: nullrev}) |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
437 for r in range(0, len(self)): |
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
438 n = self[r][7] |
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
439 nodemap[n] = r |
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
440 return nodemap |
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
441 |
43534
0c659fc20207
index: add a `has_node` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43533
diff
changeset
|
442 def has_node(self, node): |
0c659fc20207
index: add a `has_node` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43533
diff
changeset
|
443 """return True if the node exist in the index""" |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
444 return node in self._nodemap |
43534
0c659fc20207
index: add a `has_node` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43533
diff
changeset
|
445 |
43552
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43534
diff
changeset
|
446 def rev(self, node): |
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43534
diff
changeset
|
447 """return a revision for a node |
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43534
diff
changeset
|
448 |
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43534
diff
changeset
|
449 If the node is unknown, raise a RevlogError""" |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
450 return self._nodemap[node] |
43552
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43534
diff
changeset
|
451 |
43554
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43552
diff
changeset
|
452 def get_rev(self, node): |
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43552
diff
changeset
|
453 """return a revision for a node |
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43552
diff
changeset
|
454 |
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43552
diff
changeset
|
455 If the node is unknown, return None""" |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
456 return self._nodemap.get(node) |
43554
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43552
diff
changeset
|
457 |
43533
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43531
diff
changeset
|
458 def _stripnodes(self, start): |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
459 if '_nodemap' in vars(self): |
43533
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43531
diff
changeset
|
460 for r in range(start, len(self)): |
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43531
diff
changeset
|
461 n = self[r][7] |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
462 del self._nodemap[n] |
43533
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43531
diff
changeset
|
463 |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
464 def clearcaches(self): |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
465 self.__dict__.pop('_nodemap', None) |
43525
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
466 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
467 def __len__(self): |
38851
781b2720d2ac
index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38850
diff
changeset
|
468 return self._lgt + len(self._extra) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
469 |
38850
6104b203bec8
index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38848
diff
changeset
|
470 def append(self, tup): |
43574
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
471 if '_nodemap' in vars(self): |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
472 self._nodemap[tup[7]] = len(self) |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
473 data = self._pack_entry(len(self), tup) |
45936
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45645
diff
changeset
|
474 self._extra.append(data) |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
475 |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
476 def _pack_entry(self, rev, entry): |
47143
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47142
diff
changeset
|
477 assert entry[8] == 0 |
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47142
diff
changeset
|
478 assert entry[9] == 0 |
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47142
diff
changeset
|
479 return self.index_format.pack(*entry[:8]) |
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47142
diff
changeset
|
480 |
39217
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39216
diff
changeset
|
481 def _check_index(self, i): |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
482 if not isinstance(i, int): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
483 raise TypeError(b"expecting int indexes") |
39216
ec6d5a9d1631
index: don't include nullid in boundary check in pure code
Martin von Zweigbergk <martinvonz@google.com>
parents:
39047
diff
changeset
|
484 if i < 0 or i >= len(self): |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
485 raise IndexError |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
486 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
487 def __getitem__(self, i): |
39047
a1f934573c0b
parsers: adjust pure-python version to mimic a3dacabd476b
Augie Fackler <augie@google.com>
parents:
38851
diff
changeset
|
488 if i == -1: |
46407
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
489 return self.null_item |
39217
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39216
diff
changeset
|
490 self._check_index(i) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
491 if i >= self._lgt: |
45936
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45645
diff
changeset
|
492 data = self._extra[i - self._lgt] |
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45645
diff
changeset
|
493 else: |
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45645
diff
changeset
|
494 index = self._calculate_index(i) |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
495 data = self._data[index : index + self.entry_size] |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
496 r = self._unpack_entry(i, data) |
45936
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45645
diff
changeset
|
497 if self._lgt and i == 0: |
47394
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
498 offset = revlogutils.offset_type(0, gettype(r[0])) |
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
499 r = (offset,) + r[1:] |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
500 return r |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
501 |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
502 def _unpack_entry(self, rev, data): |
47142
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
503 r = self.index_format.unpack(data) |
47256
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
504 r = r + ( |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
505 0, |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
506 0, |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
507 revlog_constants.COMP_MODE_INLINE, |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
508 revlog_constants.COMP_MODE_INLINE, |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
509 ) |
47142
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
510 return r |
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
511 |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
512 def pack_header(self, header): |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
513 """pack header information as binary""" |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
514 v_fmt = revlog_constants.INDEX_HEADER |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
515 return v_fmt.pack(header) |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
516 |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
517 def entry_binary(self, rev): |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
518 """return the raw binary string representing a revision""" |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
519 entry = self[rev] |
47142
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
520 p = revlog_constants.INDEX_ENTRY_V1.pack(*entry[:8]) |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
521 if rev == 0: |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
522 p = p[revlog_constants.INDEX_HEADER.size :] |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
523 return p |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
524 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
525 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
526 class IndexObject(BaseIndexObject): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
527 def __init__(self, data): |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
528 assert len(data) % self.entry_size == 0, ( |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
529 len(data), |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
530 self.entry_size, |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
531 len(data) % self.entry_size, |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
532 ) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
533 self._data = data |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
534 self._lgt = len(data) // self.entry_size |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
535 self._extra = [] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
536 |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
537 def _calculate_index(self, i): |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
538 return i * self.entry_size |
13253 | 539 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
540 def __delitem__(self, i): |
34331
531332502568
style: always use `x is not None` instead of `not x is None`
Alex Gaynor <agaynor@mozilla.com>
parents:
32372
diff
changeset
|
541 if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
542 raise ValueError(b"deleting slices only supports a:-1 with step 1") |
39217
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39216
diff
changeset
|
543 i = i.start |
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39216
diff
changeset
|
544 self._check_index(i) |
43533
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43531
diff
changeset
|
545 self._stripnodes(i) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
546 if i < self._lgt: |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
547 self._data = self._data[: i * self.entry_size] |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
548 self._lgt = i |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
549 self._extra = [] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
550 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
551 self._extra = self._extra[: i - self._lgt] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
552 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
553 |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
554 class PersistentNodeMapIndexObject(IndexObject): |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
555 """a Debug oriented class to test persistent nodemap |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
556 |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
557 We need a simple python object to test API and higher level behavior. See |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
558 the Rust implementation for more serious usage. This should be used only |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
559 through the dedicated `devel.persistent-nodemap` config. |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
560 """ |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
561 |
44314
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
562 def nodemap_data_all(self): |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
563 """Return bytes containing a full serialization of a nodemap |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
564 |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
565 The nodemap should be valid for the full set of revisions in the |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
566 index.""" |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
567 return nodemaputil.persistent_data(self) |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44313
diff
changeset
|
568 |
44333
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
569 def nodemap_data_incremental(self): |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
570 """Return bytes containing a incremental update to persistent nodemap |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
571 |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
572 This containst the data for an append-only update of the data provided |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
573 in the last call to `update_nodemap_data`. |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
574 """ |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
575 if self._nm_root is None: |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
576 return None |
44337
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
577 docket = self._nm_docket |
44336
8374b69aef75
nodemap: track the total and unused amount of data in the rawdata file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44335
diff
changeset
|
578 changed, data = nodemaputil.update_persistent_data( |
44337
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
579 self, self._nm_root, self._nm_max_idx, self._nm_docket.tip_rev |
44333
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
580 ) |
44337
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
581 |
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
582 self._nm_root = self._nm_max_idx = self._nm_docket = None |
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
583 return docket, changed, data |
44333
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
584 |
44335
e41a164db7a9
nodemap: track the maximum revision tracked in the nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44333
diff
changeset
|
585 def update_nodemap_data(self, docket, nm_data): |
e41a164db7a9
nodemap: track the maximum revision tracked in the nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44333
diff
changeset
|
586 """provide full block of persisted binary data for a nodemap |
44320
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44314
diff
changeset
|
587 |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44314
diff
changeset
|
588 The data are expected to come from disk. See `nodemap_data_all` for a |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44314
diff
changeset
|
589 produceur of such data.""" |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44314
diff
changeset
|
590 if nm_data is not None: |
44333
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
591 self._nm_root, self._nm_max_idx = nodemaputil.parse_data(nm_data) |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
592 if self._nm_root: |
44337
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
593 self._nm_docket = docket |
44333
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44320
diff
changeset
|
594 else: |
44337
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44336
diff
changeset
|
595 self._nm_root = self._nm_max_idx = self._nm_docket = None |
44320
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44314
diff
changeset
|
596 |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
597 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
598 class InlinedIndexObject(BaseIndexObject): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
599 def __init__(self, data, inline=0): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
600 self._data = data |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
601 self._lgt = self._inline_scan(None) |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
602 self._inline_scan(self._lgt) |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
603 self._extra = [] |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
604 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
605 def _inline_scan(self, lgt): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
606 off = 0 |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
607 if lgt is not None: |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
608 self._offsets = [0] * lgt |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
609 count = 0 |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
610 while off <= len(self._data) - self.entry_size: |
46407
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
611 start = off + self.big_int_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
612 (s,) = struct.unpack( |
46407
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
613 b'>i', |
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
614 self._data[start : start + self.int_size], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
615 ) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
616 if lgt is not None: |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
617 self._offsets[count] = off |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
618 count += 1 |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46860
diff
changeset
|
619 off += self.entry_size + s |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
620 if off != len(self._data): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
621 raise ValueError(b"corrupted data") |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
622 return count |
14421
639f26cab2f5
pure parsers: properly detect corrupt index files
Augie Fackler <durin42@gmail.com>
parents:
14064
diff
changeset
|
623 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
624 def __delitem__(self, i): |
34331
531332502568
style: always use `x is not None` instead of `not x is None`
Alex Gaynor <agaynor@mozilla.com>
parents:
32372
diff
changeset
|
625 if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
626 raise ValueError(b"deleting slices only supports a:-1 with step 1") |
39217
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39216
diff
changeset
|
627 i = i.start |
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39216
diff
changeset
|
628 self._check_index(i) |
43533
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43531
diff
changeset
|
629 self._stripnodes(i) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
630 if i < self._lgt: |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
631 self._offsets = self._offsets[:i] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
632 self._lgt = i |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
633 self._extra = [] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
634 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
635 self._extra = self._extra[: i - self._lgt] |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
636 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
637 def _calculate_index(self, i): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
638 return self._offsets[i] |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
639 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
640 |
46704
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
641 def parse_index2(data, inline, revlogv2=False): |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
642 if not inline: |
46704
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
643 cls = IndexObject2 if revlogv2 else IndexObject |
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
644 return cls(data), None |
47262
468e451fc0de
revlogv2: drop the code related to inlined revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47259
diff
changeset
|
645 cls = InlinedIndexObject |
46704
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
646 return cls(data, inline), (0, data) |
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
647 |
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
648 |
47270
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
649 def parse_index_cl_v2(data): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
650 return IndexChangelogV2(data), None |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
651 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
652 |
47262
468e451fc0de
revlogv2: drop the code related to inlined revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47259
diff
changeset
|
653 class IndexObject2(IndexObject): |
46860
1dc86c2a43ce
revlog: directly use the Struct object for related operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46858
diff
changeset
|
654 index_format = revlog_constants.INDEX_ENTRY_V2 |
46704
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
655 |
47078
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47037
diff
changeset
|
656 def replace_sidedata_info( |
47259
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
657 self, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
658 rev, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
659 sidedata_offset, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
660 sidedata_length, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
661 offset_flags, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
662 compression_mode, |
47078
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents:
47037
diff
changeset
|
663 ): |
46717
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
664 """ |
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
665 Replace an existing index entry's sidedata offset and length with new |
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
666 ones. |
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
667 This cannot be used outside of the context of sidedata rewriting, |
47243
3b04cf976c67
revlog: use `rev` instead of `i` in replace_sidedata_info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
668 inside the transaction that creates the revision `rev`. |
46717
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
669 """ |
47243
3b04cf976c67
revlog: use `rev` instead of `i` in replace_sidedata_info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
670 if rev < 0: |
46717
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
671 raise KeyError |
47243
3b04cf976c67
revlog: use `rev` instead of `i` in replace_sidedata_info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47235
diff
changeset
|
672 self._check_index(rev) |
47244
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
673 if rev < self._lgt: |
46717
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
674 msg = b"cannot rewrite entries outside of this transaction" |
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
675 raise KeyError(msg) |
47244
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
676 else: |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
677 entry = list(self[rev]) |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
678 entry[0] = offset_flags |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
679 entry[8] = sidedata_offset |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
680 entry[9] = sidedata_length |
47259
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47256
diff
changeset
|
681 entry[11] = compression_mode |
47244
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
682 entry = tuple(entry) |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
683 new = self._pack_entry(rev, entry) |
47244
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47243
diff
changeset
|
684 self._extra[rev - self._lgt] = new |
46717
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Raphaël Gomès <rgomes@octobus.net>
parents:
46704
diff
changeset
|
685 |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
686 def _unpack_entry(self, rev, data): |
47256
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
687 data = self.index_format.unpack(data) |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
688 entry = data[:10] |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
689 data_comp = data[10] & 3 |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
690 sidedata_comp = (data[10] & (3 << 2)) >> 2 |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
691 return entry + (data_comp, sidedata_comp) |
47142
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
692 |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
693 def _pack_entry(self, rev, entry): |
47256
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
694 data = entry[:10] |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
695 data_comp = entry[10] & 3 |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
696 sidedata_comp = (entry[11] & 3) << 2 |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
697 data += (data_comp | sidedata_comp,) |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
698 |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47251
diff
changeset
|
699 return self.index_format.pack(*data) |
47143
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47142
diff
changeset
|
700 |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
701 def entry_binary(self, rev): |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
702 """return the raw binary string representing a revision""" |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
703 entry = self[rev] |
47267
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
704 return self._pack_entry(rev, entry) |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
705 |
47235
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
706 def pack_header(self, header): |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
707 """pack header information as binary""" |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
708 msg = 'version header should go in the docket, not the index: %d' |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
709 msg %= header |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
710 raise error.ProgrammingError(msg) |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47143
diff
changeset
|
711 |
46704
913485776542
revlog: introduce v2 format
Raphaël Gomès <rgomes@octobus.net>
parents:
46635
diff
changeset
|
712 |
47270
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
713 class IndexChangelogV2(IndexObject2): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
714 index_format = revlog_constants.INDEX_ENTRY_CL_V2 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
715 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
716 def _unpack_entry(self, rev, data, r=True): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
717 items = self.index_format.unpack(data) |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
718 entry = items[:3] + (rev, rev) + items[3:8] |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
719 data_comp = items[8] & 3 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
720 sidedata_comp = (items[8] >> 2) & 3 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
721 return entry + (data_comp, sidedata_comp) |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
722 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
723 def _pack_entry(self, rev, entry): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
724 assert entry[3] == rev, entry[3] |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
725 assert entry[4] == rev, entry[4] |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
726 data = entry[:3] + entry[5:10] |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
727 data_comp = entry[10] & 3 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
728 sidedata_comp = (entry[11] & 3) << 2 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
729 data += (data_comp | sidedata_comp,) |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
730 return self.index_format.pack(*data) |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
731 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47268
diff
changeset
|
732 |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
733 def parse_index_devel_nodemap(data, inline): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45936
diff
changeset
|
734 """like parse_index2, but alway return a PersistentNodeMapIndexObject""" |
44313
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
735 return PersistentNodeMapIndexObject(data), None |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
736 |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44034
diff
changeset
|
737 |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
738 def parse_dirstate(dmap, copymap, st): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
739 parents = [st[:20], st[20:40]] |
17425
e95ec38f86b0
fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents:
14995
diff
changeset
|
740 # dereference fields so they will be local in loop |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
741 format = b">cllll" |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
742 e_size = struct.calcsize(format) |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
743 pos1 = 40 |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
744 l = len(st) |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
745 |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
746 # the inner loop |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
747 while pos1 < l: |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
748 pos2 = pos1 + e_size |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
749 e = _unpack(b">cllll", st[pos1:pos2]) # a literal here is faster |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
750 pos1 = pos2 + e[4] |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
751 f = st[pos2:pos1] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
752 if b'\0' in f: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
753 f, c = f.split(b'\0') |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
754 copymap[f] = c |
47665
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
755 dmap[f] = DirstateItem.from_v1_data(*e[:4]) |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
756 return parents |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
757 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39217
diff
changeset
|
758 |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
759 def pack_dirstate(dmap, copymap, pl, now): |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
760 now = int(now) |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
27339
diff
changeset
|
761 cs = stringio() |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
762 write = cs.write |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
763 write(b"".join(pl)) |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
764 for f, e in pycompat.iteritems(dmap): |
47540
1a6302427eb9
dirstate-item: use need_delay when packing dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47539
diff
changeset
|
765 if e.need_delay(now): |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
766 # The file was last modified "simultaneously" with the current |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
767 # write to dirstate (i.e. within the same second for file- |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
768 # systems with a granularity of 1 sec). This commonly happens |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
769 # for at least a couple of files on 'update'. |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
770 # The user could change the file without changing its size |
19652
187bf2dde7c1
pack_dirstate: only invalidate mtime for files written in the last second
Siddharth Agarwal <sid0@fb.com>
parents:
18567
diff
changeset
|
771 # within the same second. Invalidate the file's mtime in |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
772 # dirstate, forcing future 'status' calls to compare the |
19652
187bf2dde7c1
pack_dirstate: only invalidate mtime for files written in the last second
Siddharth Agarwal <sid0@fb.com>
parents:
18567
diff
changeset
|
773 # contents of the file if the size is the same. This prevents |
187bf2dde7c1
pack_dirstate: only invalidate mtime for files written in the last second
Siddharth Agarwal <sid0@fb.com>
parents:
18567
diff
changeset
|
774 # mistakenly treating such files as clean. |
47667
d06ced90c80f
dirstate-item: use `set_possibly_dirty` in `pure.pack_dirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47666
diff
changeset
|
775 e.set_possibly_dirty() |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
776 |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
777 if f in copymap: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
778 f = b"%s\0%s" % (f, copymap[f]) |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
779 e = _pack( |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
780 b">cllll", |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
781 e.v1_state(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
782 e.v1_mode(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
783 e.v1_size(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
784 e.v1_mtime(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
785 len(f), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
786 ) |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
787 write(e) |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
788 write(f) |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
789 return cs.getvalue() |