Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/pure/parsers.py @ 48261:1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Right now, a files with a file system state that requires a lookup (same size,
different mtime) will requires a lookup. If the result of that lookup is a
modified files, it will remains ambiguous, requiring a lookup on the next status
run too.
To fix this, we introduce a dedicated flag in the new format. Such flag will
allow to record such file as "known modified" avoiding an extra lookup later.
As None of the associate code currently exist in the status code, we do the
minimal implementation: if we read a dirstate entry with this flag set, we make
it as "ambiguous" so that the next status code has to look it up. The same as it
would have to without this flag existing anyway.
Differential Revision: https://phab.mercurial-scm.org/D11681
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 15 Oct 2021 16:12:00 +0200 |
parents | f7fd629ffb98 |
children | dfc5a505ddc5 |
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:
46730
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 |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
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 |
47055
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 |
43573
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 ( |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
20 error, |
43573
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, |
47400
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47281
diff
changeset
|
22 revlogutils, |
43573
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:
39245
diff
changeset
|
25 |
44035
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43663
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 |
44035
ab595920de0e
revlogutils: move the NodeMap class in a dedicated nodemap module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43663
diff
changeset
|
28 |
36964
644a02f6b34f
util: prefer "bytesio" to "stringio"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34338
diff
changeset
|
29 stringio = pycompat.bytesio |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
30 |
31230
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:
47495
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 |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
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:
48200
diff
changeset
|
48 DIRSTATE_V2_WDIR_TRACKED = 1 << 0 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
49 DIRSTATE_V2_P1_TRACKED = 1 << 1 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
50 DIRSTATE_V2_P2_INFO = 1 << 2 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
51 DIRSTATE_V2_HAS_MODE_AND_SIZE = 1 << 3 |
48244
f7fd629ffb98
dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents:
48241
diff
changeset
|
52 DIRSTATE_V2_HAS_FILE_MTIME = 1 << 4 |
f7fd629ffb98
dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents:
48241
diff
changeset
|
53 _DIRSTATE_V2_HAS_DIRCTORY_MTIME = 1 << 5 # Unused when Rust is not available |
f7fd629ffb98
dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents:
48241
diff
changeset
|
54 DIRSTATE_V2_MODE_EXEC_PERM = 1 << 6 |
f7fd629ffb98
dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents:
48241
diff
changeset
|
55 DIRSTATE_V2_MODE_IS_SYMLINK = 1 << 7 |
48261
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
56 DIRSTATE_V2_EXPECTED_STATE_IS_MODIFIED = 1 << 8 |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
57 |
47514
559aee84b889
dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47513
diff
changeset
|
58 |
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
|
59 @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
|
60 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:
47495
diff
changeset
|
61 """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:
47495
diff
changeset
|
62 |
48124
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
63 It hold multiple attributes |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
64 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
65 # about file tracking |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
66 - 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:
48123
diff
changeset
|
67 - p1_tracked: is the file tracked in working copy first parent |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
68 - 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:
48125
diff
changeset
|
69 because it was actually merged, or because the p2 version was |
48200
77fc340acad7
dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents:
48176
diff
changeset
|
70 ahead, or because some rename moved it there. In either case |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
71 `hg status` will want it displayed as modified. |
48124
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
72 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
73 # about the file state expected from p1 manifest: |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
74 - mode: the file mode in p1 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
75 - size: the file size in p1 |
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
76 |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
77 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:
48125
diff
changeset
|
78 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:
48125
diff
changeset
|
79 `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:
48125
diff
changeset
|
80 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:
48125
diff
changeset
|
81 the file is clean. |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
82 |
48124
fabf687df0ff
dirstate-item: update the attribute documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48123
diff
changeset
|
83 # 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:
48123
diff
changeset
|
84 - 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:
48123
diff
changeset
|
85 |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
86 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:
48125
diff
changeset
|
87 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:
48125
diff
changeset
|
88 yet. |
47495
084ed6a7c6fd
dirstate: document the dirstatetuple content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
89 """ |
084ed6a7c6fd
dirstate: document the dirstatetuple content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47400
diff
changeset
|
90 |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
91 _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:
47957
diff
changeset
|
92 _p1_tracked = attr.ib() |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
93 _p2_info = attr.ib() |
47566
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
94 _mode = attr.ib() |
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
95 _size = attr.ib() |
3df817387ea3
parsers: move DirstateItem to attr.s
Augie Fackler <augie@google.com>
parents:
47540
diff
changeset
|
96 _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:
47495
diff
changeset
|
97 |
47926
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
98 def __init__( |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
99 self, |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
100 wc_tracked=False, |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
101 p1_tracked=False, |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
102 p2_info=False, |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
103 has_meaningful_data=True, |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
104 has_meaningful_mtime=True, |
47926
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
105 parentfiledata=None, |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
106 ): |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
107 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:
47957
diff
changeset
|
108 self._p1_tracked = p1_tracked |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
109 self._p2_info = p2_info |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
110 |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
111 self._mode = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
112 self._size = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
113 self._mtime = None |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
114 if parentfiledata is None: |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
115 has_meaningful_mtime = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
116 has_meaningful_data = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
117 if has_meaningful_data: |
47926
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
118 self._mode = parentfiledata[0] |
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
119 self._size = parentfiledata[1] |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
120 if has_meaningful_mtime: |
47926
22c39f8acf78
dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47921
diff
changeset
|
121 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
|
122 |
47665
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
123 @classmethod |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
124 def from_v2_data(cls, flags, size, mtime): |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
125 """Build a new DirstateItem object from V2 data""" |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
126 has_mode_size = bool(flags & DIRSTATE_V2_HAS_MODE_AND_SIZE) |
48261
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
127 has_meaningful_mtime = bool(flags & DIRSTATE_V2_HAS_FILE_MTIME) |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
128 mode = None |
48261
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
129 |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
130 if flags & +DIRSTATE_V2_EXPECTED_STATE_IS_MODIFIED: |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
131 # we do not have support for this flag in the code yet, |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
132 # force a lookup for this file. |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
133 has_mode_size = False |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
134 has_meaningful_mtime = False |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
135 |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
136 if has_mode_size: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
137 assert stat.S_IXUSR == 0o100 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
138 if flags & DIRSTATE_V2_MODE_EXEC_PERM: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
139 mode = 0o755 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
140 else: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
141 mode = 0o644 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
142 if flags & DIRSTATE_V2_MODE_IS_SYMLINK: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
143 mode |= stat.S_IFLNK |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
144 else: |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
145 mode |= stat.S_IFREG |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
146 return cls( |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
147 wc_tracked=bool(flags & DIRSTATE_V2_WDIR_TRACKED), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
148 p1_tracked=bool(flags & DIRSTATE_V2_P1_TRACKED), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
149 p2_info=bool(flags & DIRSTATE_V2_P2_INFO), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
150 has_meaningful_data=has_mode_size, |
48261
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48244
diff
changeset
|
151 has_meaningful_mtime=has_meaningful_mtime, |
48233
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
152 parentfiledata=(mode, size, mtime), |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
153 ) |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
154 |
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48200
diff
changeset
|
155 @classmethod |
47665
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
156 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
|
157 """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
|
158 |
a4443f66be6a
dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47664
diff
changeset
|
159 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
|
160 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
|
161 """ |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
162 if state == b'm': |
48166
7a8c9869e4fe
dirstate-item: replace call to new_merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48165
diff
changeset
|
163 return cls(wc_tracked=True, p1_tracked=True, p2_info=True) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
164 elif state == b'a': |
48168
d342815ff827
dirstate-item: replace call to new_added
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48167
diff
changeset
|
165 return cls(wc_tracked=True) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
166 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:
47957
diff
changeset
|
167 if size == NONNORMAL: |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
168 p1_tracked = True |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
169 p2_info = True |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
170 elif size == FROM_P2: |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
171 p1_tracked = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
172 p2_info = True |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
173 else: |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
174 p1_tracked = True |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
175 p2_info = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
176 return cls(p1_tracked=p1_tracked, p2_info=p2_info) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
177 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:
47957
diff
changeset
|
178 if size == FROM_P2: |
48170
da304f78a0e1
dirstate-item: replace call to new_from_p2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48169
diff
changeset
|
179 return cls(wc_tracked=True, p2_info=True) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
180 elif size == NONNORMAL: |
48172
898de425bcd6
dirstate-item: replace call to new_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48171
diff
changeset
|
181 return cls(wc_tracked=True, p1_tracked=True) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
182 elif mtime == AMBIGUOUS_TIME: |
48174
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48173
diff
changeset
|
183 return cls( |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48173
diff
changeset
|
184 wc_tracked=True, |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48173
diff
changeset
|
185 p1_tracked=True, |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48173
diff
changeset
|
186 has_meaningful_mtime=False, |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48173
diff
changeset
|
187 parentfiledata=(mode, size, 42), |
79ebbe19d9e3
dirstate-item: replace a call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48173
diff
changeset
|
188 ) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
189 else: |
48175
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48174
diff
changeset
|
190 return cls( |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48174
diff
changeset
|
191 wc_tracked=True, |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48174
diff
changeset
|
192 p1_tracked=True, |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48174
diff
changeset
|
193 parentfiledata=(mode, size, mtime), |
d0081dbca442
dirstate-item: replace call to new_normal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48174
diff
changeset
|
194 ) |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
195 else: |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
196 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
|
197 |
47666
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
198 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
|
199 """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
|
200 |
e53256a9f9c5
dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47665
diff
changeset
|
201 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
|
202 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
|
203 """ |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
204 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
|
205 |
48002
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47969
diff
changeset
|
206 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:
47969
diff
changeset
|
207 """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:
47969
diff
changeset
|
208 |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47969
diff
changeset
|
209 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:
47969
diff
changeset
|
210 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:
47969
diff
changeset
|
211 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:
47969
diff
changeset
|
212 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:
47969
diff
changeset
|
213 """ |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47969
diff
changeset
|
214 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:
47969
diff
changeset
|
215 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:
47969
diff
changeset
|
216 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:
47969
diff
changeset
|
217 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:
47969
diff
changeset
|
218 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:
47969
diff
changeset
|
219 |
48014
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
220 def set_tracked(self): |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
221 """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:
48002
diff
changeset
|
222 |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
223 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:
48002
diff
changeset
|
224 """ |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
225 self._wc_tracked = True |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
226 # `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:
48125
diff
changeset
|
227 # the files as needing lookup |
48014
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
228 # |
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
229 # Consider dropping this in the future in favor of something less broad. |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
230 self._mtime = None |
48014
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48002
diff
changeset
|
231 |
47921
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
232 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
|
233 """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
|
234 |
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
235 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
|
236 """ |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
237 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:
47957
diff
changeset
|
238 self._mode = None |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
239 self._size = None |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
240 self._mtime = None |
47921
3853e6ee160d
dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
241 |
48075
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48014
diff
changeset
|
242 def drop_merge_data(self): |
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48014
diff
changeset
|
243 """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:
48014
diff
changeset
|
244 |
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48014
diff
changeset
|
245 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:
48014
diff
changeset
|
246 """ |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
247 if self._p2_info: |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
248 self._p2_info = False |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
249 self._mode = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
250 self._size = None |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
251 self._mtime = None |
48075
a660d8a53267
dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48014
diff
changeset
|
252 |
47512
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
253 @property |
47536
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
254 def mode(self): |
47957
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47956
diff
changeset
|
255 return self.v1_mode() |
47536
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
256 |
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
257 @property |
47537
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
258 def size(self): |
47957
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47956
diff
changeset
|
259 return self.v1_size() |
47537
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
260 |
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
261 @property |
47538
77fce401a2bb
dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47537
diff
changeset
|
262 def mtime(self): |
47957
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47956
diff
changeset
|
263 return self.v1_mtime() |
47538
77fce401a2bb
dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47537
diff
changeset
|
264 |
77fce401a2bb
dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47537
diff
changeset
|
265 @property |
47512
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
266 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
|
267 """ |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
268 States are: |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
269 n normal |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
270 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
|
271 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
|
272 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
|
273 |
769037a279ec
dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47509
diff
changeset
|
274 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
|
275 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
|
276 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
|
277 """ |
48123
d73b42f905f8
dirstate-item: use `any_tracked` more
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
278 if not self.any_tracked: |
48100
418611f18fd8
dirstate-entry: use `?` for the state of entry without any tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48099
diff
changeset
|
279 return b'?' |
47957
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47956
diff
changeset
|
280 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
|
281 |
47513
10e740292dff
dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47512
diff
changeset
|
282 @property |
47531
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
283 def tracked(self): |
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
284 """True is the file is tracked in the working copy""" |
47959
f1033c2d9b66
dirstate-item: implement `tracked` in a simpler way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47958
diff
changeset
|
285 return self._wc_tracked |
47531
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
286 |
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47526
diff
changeset
|
287 @property |
48099
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48098
diff
changeset
|
288 def any_tracked(self): |
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48098
diff
changeset
|
289 """True is the file is tracked anywhere (wc or parents)""" |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
290 return self._wc_tracked or self._p1_tracked or self._p2_info |
48099
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48098
diff
changeset
|
291 |
79bc60ca5946
dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48098
diff
changeset
|
292 @property |
47526
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
293 def added(self): |
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
294 """True if the file has been added""" |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
295 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
|
296 |
8bcae9bf9e8d
dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
297 @property |
48098
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
298 def maybe_clean(self): |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
299 """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:
48082
diff
changeset
|
300 if not self._wc_tracked: |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
301 return False |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
302 elif not self._p1_tracked: |
48098
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
303 return False |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
304 elif self._p2_info: |
48098
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
305 return False |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
306 return True |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
307 |
80783e553bd5
dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48082
diff
changeset
|
308 @property |
48155
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48154
diff
changeset
|
309 def p1_tracked(self): |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48154
diff
changeset
|
310 """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:
48154
diff
changeset
|
311 return self._p1_tracked |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48154
diff
changeset
|
312 |
21542d4cb568
dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48154
diff
changeset
|
313 @property |
48154
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48150
diff
changeset
|
314 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:
48150
diff
changeset
|
315 """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:
48150
diff
changeset
|
316 |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48150
diff
changeset
|
317 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:
48150
diff
changeset
|
318 """ |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48150
diff
changeset
|
319 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:
48150
diff
changeset
|
320 |
fb3b41d583c2
dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48150
diff
changeset
|
321 @property |
47515
c94d3ff46fd5
dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47514
diff
changeset
|
322 def removed(self): |
c94d3ff46fd5
dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47514
diff
changeset
|
323 """True if the file has been removed""" |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
324 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
|
325 |
48234
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
326 def v2_data(self): |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
327 """Returns (flags, mode, size, mtime) for v2 serialization""" |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
328 flags = 0 |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
329 if self._wc_tracked: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
330 flags |= DIRSTATE_V2_WDIR_TRACKED |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
331 if self._p1_tracked: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
332 flags |= DIRSTATE_V2_P1_TRACKED |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
333 if self._p2_info: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
334 flags |= DIRSTATE_V2_P2_INFO |
48241
db5897321351
dirstate-v2: Use attributes as intended instead of properties in v2_data()
Simon Sapin <simon.sapin@octobus.net>
parents:
48234
diff
changeset
|
335 if self._mode is not None and self._size is not None: |
48234
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
336 flags |= DIRSTATE_V2_HAS_MODE_AND_SIZE |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
337 if self.mode & stat.S_IXUSR: |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
338 flags |= DIRSTATE_V2_MODE_EXEC_PERM |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
339 if stat.S_ISLNK(self.mode): |
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
340 flags |= DIRSTATE_V2_MODE_IS_SYMLINK |
48241
db5897321351
dirstate-v2: Use attributes as intended instead of properties in v2_data()
Simon Sapin <simon.sapin@octobus.net>
parents:
48234
diff
changeset
|
341 if self._mtime is not None: |
48244
f7fd629ffb98
dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents:
48241
diff
changeset
|
342 flags |= DIRSTATE_V2_HAS_FILE_MTIME |
48241
db5897321351
dirstate-v2: Use attributes as intended instead of properties in v2_data()
Simon Sapin <simon.sapin@octobus.net>
parents:
48234
diff
changeset
|
343 return (flags, self._size or 0, self._mtime or 0) |
48234
7e78c72ee3ea
dirstate-v2: Initial Python serializer
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48233
diff
changeset
|
344 |
47509
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
345 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
|
346 """return a "state" suitable for v1 serialization""" |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
347 if not self.any_tracked: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
348 # 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:
47957
diff
changeset
|
349 # unsupported |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
350 raise RuntimeError('untracked item') |
47967
0d185f73c619
dirstate-item: implement v1_state with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47966
diff
changeset
|
351 elif self.removed: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
352 return b'r' |
48164
8f88307f8e07
dirstate-item: replace another usage of `merged`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48162
diff
changeset
|
353 elif self._p1_tracked and self._p2_info: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
354 return b'm' |
47967
0d185f73c619
dirstate-item: implement v1_state with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47966
diff
changeset
|
355 elif self.added: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
356 return b'a' |
47967
0d185f73c619
dirstate-item: implement v1_state with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47966
diff
changeset
|
357 else: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
358 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
|
359 |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
360 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
|
361 """return a "mode" suitable for v1 serialization""" |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
362 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
|
363 |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
364 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
|
365 """return a "size" suitable for v1 serialization""" |
48123
d73b42f905f8
dirstate-item: use `any_tracked` more
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
366 if not self.any_tracked: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
367 # 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:
47957
diff
changeset
|
368 # unsupported |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
369 raise RuntimeError('untracked item') |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
370 elif self.removed and self._p1_tracked and self._p2_info: |
47968
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47967
diff
changeset
|
371 return NONNORMAL |
48161
6ac2b417d5d7
dirstate-item: directly use `p2_info` in `v1_size`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48155
diff
changeset
|
372 elif self._p2_info: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
373 return FROM_P2 |
47968
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47967
diff
changeset
|
374 elif self.removed: |
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47967
diff
changeset
|
375 return 0 |
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47967
diff
changeset
|
376 elif self.added: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
377 return NONNORMAL |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
378 elif self._size is None: |
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
379 return NONNORMAL |
47968
dbf2d03850a2
dirstate-item: implement `v1_size` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47967
diff
changeset
|
380 else: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
381 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
|
382 |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
383 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
|
384 """return a "mtime" suitable for v1 serialization""" |
48123
d73b42f905f8
dirstate-item: use `any_tracked` more
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
385 if not self.any_tracked: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
386 # 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:
47957
diff
changeset
|
387 # unsupported |
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
388 raise RuntimeError('untracked item') |
47969
508394e38580
dirstate-item: implement `v1_mtime` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47968
diff
changeset
|
389 elif self.removed: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
390 return 0 |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
391 elif self._mtime is None: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
392 return AMBIGUOUS_TIME |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
393 elif self._p2_info: |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
394 return AMBIGUOUS_TIME |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
395 elif not self._p1_tracked: |
47969
508394e38580
dirstate-item: implement `v1_mtime` with higher level block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47968
diff
changeset
|
396 return AMBIGUOUS_TIME |
47958
b81f52ca8075
dirstate-item: keep the full information in memory (for pure form)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47957
diff
changeset
|
397 else: |
48150
38488d488ec1
dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
398 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
|
399 |
47532
ccbabaee5c36
dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47531
diff
changeset
|
400 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
|
401 """True if the stored mtime would be ambiguous with the current time""" |
47957
05f2be3affe3
dirstate-item: have all the logic go through the v1_ accessors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47956
diff
changeset
|
402 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
|
403 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
404 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
405 def gettype(q): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
406 return int(q & 0xFFFF) |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
407 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
408 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
409 class BaseIndexObject(object): |
47279
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47278
diff
changeset
|
410 # 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:
47278
diff
changeset
|
411 rust_ext_compat = 0 |
46674
e83327af26f1
pure-parsers: document index class constants
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46479
diff
changeset
|
412 # 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
|
413 index_format = revlog_constants.INDEX_ENTRY_V1 |
46674
e83327af26f1
pure-parsers: document index class constants
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46479
diff
changeset
|
414 # 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:
46479
diff
changeset
|
415 big_int_size = struct.calcsize(b'>Q') |
e83327af26f1
pure-parsers: document index class constants
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46479
diff
changeset
|
416 # Size of a C long int, platform independent |
e83327af26f1
pure-parsers: document index class constants
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46479
diff
changeset
|
417 int_size = struct.calcsize(b'>i') |
e83327af26f1
pure-parsers: document index class constants
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46479
diff
changeset
|
418 # An empty index entry, used as a default value to be overridden, or nullrev |
47260
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
419 null_item = ( |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
420 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
421 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
422 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
423 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
424 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
425 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
426 -1, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
427 sha1nodeconstants.nullid, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
428 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
429 0, |
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
430 revlog_constants.COMP_MODE_INLINE, |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
431 revlog_constants.COMP_MODE_INLINE, |
47260
130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47255
diff
changeset
|
432 ) |
46479
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45957
diff
changeset
|
433 |
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
|
434 @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
|
435 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
|
436 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
|
437 |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
438 @property |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
439 def nodemap(self): |
43663
c207c46a86b9
py3: pass a bytes value for "msg" to nouideprecwarn()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43622
diff
changeset
|
440 msg = b"index.nodemap is deprecated, use index.[has_node|rev|get_rev]" |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
441 util.nouideprecwarn(msg, b'5.3', stacklevel=2) |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
442 return self._nodemap |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
443 |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
444 @util.propertycache |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
445 def _nodemap(self): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46974
diff
changeset
|
446 nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: nullrev}) |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
447 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
|
448 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
|
449 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
|
450 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
|
451 |
43582
0c659fc20207
index: add a `has_node` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43581
diff
changeset
|
452 def has_node(self, node): |
0c659fc20207
index: add a `has_node` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43581
diff
changeset
|
453 """return True if the node exist in the index""" |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
454 return node in self._nodemap |
43582
0c659fc20207
index: add a `has_node` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43581
diff
changeset
|
455 |
43600
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43582
diff
changeset
|
456 def rev(self, node): |
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43582
diff
changeset
|
457 """return a revision for a node |
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43582
diff
changeset
|
458 |
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43582
diff
changeset
|
459 If the node is unknown, raise a RevlogError""" |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
460 return self._nodemap[node] |
43600
bd87114ce341
index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43582
diff
changeset
|
461 |
43602
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
462 def get_rev(self, node): |
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
463 """return a revision for a node |
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
464 |
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
465 If the node is unknown, return None""" |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
466 return self._nodemap.get(node) |
43602
b56de57c45ce
index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43600
diff
changeset
|
467 |
43581
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43579
diff
changeset
|
468 def _stripnodes(self, start): |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
469 if '_nodemap' in vars(self): |
43581
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43579
diff
changeset
|
470 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:
43579
diff
changeset
|
471 n = self[r][7] |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
472 del self._nodemap[n] |
43581
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43579
diff
changeset
|
473 |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
474 def clearcaches(self): |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
475 self.__dict__.pop('_nodemap', None) |
43573
845e5b313783
revlog: move the nodemap into the index object (for pure)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43106
diff
changeset
|
476 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
477 def __len__(self): |
38890
781b2720d2ac
index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents:
38889
diff
changeset
|
478 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
|
479 |
38889
6104b203bec8
index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38887
diff
changeset
|
480 def append(self, tup): |
43622
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
481 if '_nodemap' in vars(self): |
02802fa87b74
revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43602
diff
changeset
|
482 self._nodemap[tup[7]] = len(self) |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
483 data = self._pack_entry(len(self), tup) |
45951
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45647
diff
changeset
|
484 self._extra.append(data) |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
485 |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
486 def _pack_entry(self, rev, entry): |
47157
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47156
diff
changeset
|
487 assert entry[8] == 0 |
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47156
diff
changeset
|
488 assert entry[9] == 0 |
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47156
diff
changeset
|
489 return self.index_format.pack(*entry[:8]) |
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47156
diff
changeset
|
490 |
39245
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39244
diff
changeset
|
491 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
|
492 if not isinstance(i, int): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
493 raise TypeError(b"expecting int indexes") |
39244
ec6d5a9d1631
index: don't include nullid in boundary check in pure code
Martin von Zweigbergk <martinvonz@google.com>
parents:
39084
diff
changeset
|
494 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
|
495 raise IndexError |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
496 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
497 def __getitem__(self, i): |
39084
a1f934573c0b
parsers: adjust pure-python version to mimic a3dacabd476b
Augie Fackler <augie@google.com>
parents:
38890
diff
changeset
|
498 if i == -1: |
46479
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45957
diff
changeset
|
499 return self.null_item |
39245
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39244
diff
changeset
|
500 self._check_index(i) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
501 if i >= self._lgt: |
45951
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45647
diff
changeset
|
502 data = self._extra[i - self._lgt] |
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45647
diff
changeset
|
503 else: |
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45647
diff
changeset
|
504 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
|
505 data = self._data[index : index + self.entry_size] |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
506 r = self._unpack_entry(i, data) |
45951
0ce15a8c7b8b
revlog: store new index entries as binary
Joerg Sonnenberger <joerg@bec.de>
parents:
45647
diff
changeset
|
507 if self._lgt and i == 0: |
47400
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47281
diff
changeset
|
508 offset = revlogutils.offset_type(0, gettype(r[0])) |
ac60a1366a49
revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47281
diff
changeset
|
509 r = (offset,) + r[1:] |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
510 return r |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
511 |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
512 def _unpack_entry(self, rev, data): |
47156
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47095
diff
changeset
|
513 r = self.index_format.unpack(data) |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
514 r = r + ( |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
515 0, |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
516 0, |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
517 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:
47262
diff
changeset
|
518 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:
47262
diff
changeset
|
519 ) |
47156
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47095
diff
changeset
|
520 return r |
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47095
diff
changeset
|
521 |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
522 def pack_header(self, header): |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
523 """pack header information as binary""" |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
524 v_fmt = revlog_constants.INDEX_HEADER |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
525 return v_fmt.pack(header) |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
526 |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
527 def entry_binary(self, rev): |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
528 """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:
47055
diff
changeset
|
529 entry = self[rev] |
47156
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47095
diff
changeset
|
530 p = revlog_constants.INDEX_ENTRY_V1.pack(*entry[:8]) |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
531 if rev == 0: |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
532 p = p[revlog_constants.INDEX_HEADER.size :] |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
533 return p |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
534 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
535 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
536 class IndexObject(BaseIndexObject): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
537 def __init__(self, data): |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
538 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:
47055
diff
changeset
|
539 len(data), |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
540 self.entry_size, |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
541 len(data) % self.entry_size, |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
542 ) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
543 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
|
544 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
|
545 self._extra = [] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
546 |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
547 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
|
548 return i * self.entry_size |
13253 | 549 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
550 def __delitem__(self, i): |
34338
531332502568
style: always use `x is not None` instead of `not x is None`
Alex Gaynor <agaynor@mozilla.com>
parents:
32411
diff
changeset
|
551 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
|
552 raise ValueError(b"deleting slices only supports a:-1 with step 1") |
39245
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39244
diff
changeset
|
553 i = i.start |
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39244
diff
changeset
|
554 self._check_index(i) |
43581
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43579
diff
changeset
|
555 self._stripnodes(i) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
556 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
|
557 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
|
558 self._lgt = i |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
559 self._extra = [] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
560 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
561 self._extra = self._extra[: i - self._lgt] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
562 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
563 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
564 class PersistentNodeMapIndexObject(IndexObject): |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
565 """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:
44035
diff
changeset
|
566 |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
567 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:
44035
diff
changeset
|
568 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:
44035
diff
changeset
|
569 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:
44035
diff
changeset
|
570 """ |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
571 |
44357
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
572 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:
44356
diff
changeset
|
573 """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:
44356
diff
changeset
|
574 |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
575 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:
44356
diff
changeset
|
576 index.""" |
7f4f7ef3133e
nodemap: add a optional `nodemap_add_full` method on indexes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44356
diff
changeset
|
577 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:
44356
diff
changeset
|
578 |
44367
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
579 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:
44363
diff
changeset
|
580 """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:
44363
diff
changeset
|
581 |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
582 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:
44363
diff
changeset
|
583 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:
44363
diff
changeset
|
584 """ |
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
585 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:
44363
diff
changeset
|
586 return None |
44371
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44370
diff
changeset
|
587 docket = self._nm_docket |
44370
8374b69aef75
nodemap: track the total and unused amount of data in the rawdata file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44369
diff
changeset
|
588 changed, data = nodemaputil.update_persistent_data( |
44371
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44370
diff
changeset
|
589 self, self._nm_root, self._nm_max_idx, self._nm_docket.tip_rev |
44367
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
590 ) |
44371
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44370
diff
changeset
|
591 |
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44370
diff
changeset
|
592 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:
44370
diff
changeset
|
593 return docket, changed, data |
44367
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
594 |
44369
e41a164db7a9
nodemap: track the maximum revision tracked in the nodemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44367
diff
changeset
|
595 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:
44367
diff
changeset
|
596 """provide full block of persisted binary data for a nodemap |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44357
diff
changeset
|
597 |
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44357
diff
changeset
|
598 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:
44357
diff
changeset
|
599 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:
44357
diff
changeset
|
600 if nm_data is not None: |
44367
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
601 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:
44363
diff
changeset
|
602 if self._nm_root: |
44371
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44370
diff
changeset
|
603 self._nm_docket = docket |
44367
50ad851efd9b
nodemap: introduce append-only incremental update of the persistent data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44363
diff
changeset
|
604 else: |
44371
1d2b37def017
nodemap: double check the source docket when doing incremental update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44370
diff
changeset
|
605 self._nm_root = self._nm_max_idx = self._nm_docket = None |
44363
671f9479af0e
nodemap: provide the on disk data to indexes who support it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44357
diff
changeset
|
606 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
607 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
608 class InlinedIndexObject(BaseIndexObject): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
609 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
|
610 self._data = data |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
611 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
|
612 self._inline_scan(self._lgt) |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
613 self._extra = [] |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
614 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
615 def _inline_scan(self, lgt): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
616 off = 0 |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
617 if lgt is not None: |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
618 self._offsets = [0] * lgt |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
619 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
|
620 while off <= len(self._data) - self.entry_size: |
46479
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45957
diff
changeset
|
621 start = off + self.big_int_size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
622 (s,) = struct.unpack( |
46479
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45957
diff
changeset
|
623 b'>i', |
095fa99ae5f5
revlog: prepare pure parser for being overloaded
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45957
diff
changeset
|
624 self._data[start : start + self.int_size], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
625 ) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
626 if lgt is not None: |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
627 self._offsets[count] = off |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
628 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
|
629 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
|
630 if off != len(self._data): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
631 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
|
632 return count |
14421
639f26cab2f5
pure parsers: properly detect corrupt index files
Augie Fackler <durin42@gmail.com>
parents:
14064
diff
changeset
|
633 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
634 def __delitem__(self, i): |
34338
531332502568
style: always use `x is not None` instead of `not x is None`
Alex Gaynor <agaynor@mozilla.com>
parents:
32411
diff
changeset
|
635 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
|
636 raise ValueError(b"deleting slices only supports a:-1 with step 1") |
39245
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39244
diff
changeset
|
637 i = i.start |
5961517fd2a8
index: rename _fix_index() since it no longer fixes the index
Martin von Zweigbergk <martinvonz@google.com>
parents:
39244
diff
changeset
|
638 self._check_index(i) |
43581
642433629e20
revlog: deal with nodemap deletion within the index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43579
diff
changeset
|
639 self._stripnodes(i) |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
640 if i < self._lgt: |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
641 self._offsets = self._offsets[:i] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
642 self._lgt = i |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
643 self._extra = [] |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
644 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
645 self._extra = self._extra[: i - self._lgt] |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
646 |
29133
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
647 def _calculate_index(self, i): |
255274719dc1
pure: write a really lazy version of pure indexObject
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
648 return self._offsets[i] |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
649 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
650 |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
651 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
|
652 if not inline: |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
653 cls = IndexObject2 if revlogv2 else IndexObject |
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
654 return cls(data), None |
47273
468e451fc0de
revlogv2: drop the code related to inlined revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
655 cls = InlinedIndexObject |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
656 return cls(data, inline), (0, data) |
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
657 |
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
658 |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
659 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:
47279
diff
changeset
|
660 return IndexChangelogV2(data), None |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
661 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
662 |
47273
468e451fc0de
revlogv2: drop the code related to inlined revlogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47270
diff
changeset
|
663 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
|
664 index_format = revlog_constants.INDEX_ENTRY_V2 |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
665 |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
666 def replace_sidedata_info( |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
667 self, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
668 rev, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
669 sidedata_offset, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
670 sidedata_length, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
671 offset_flags, |
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
672 compression_mode, |
47095
223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47078
diff
changeset
|
673 ): |
46730
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
674 """ |
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
675 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:
46717
diff
changeset
|
676 ones. |
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
677 This cannot be used outside of the context of sidedata rewriting, |
47254
3b04cf976c67
revlog: use `rev` instead of `i` in replace_sidedata_info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
678 inside the transaction that creates the revision `rev`. |
46730
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
679 """ |
47254
3b04cf976c67
revlog: use `rev` instead of `i` in replace_sidedata_info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
680 if rev < 0: |
46730
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
681 raise KeyError |
47254
3b04cf976c67
revlog: use `rev` instead of `i` in replace_sidedata_info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47246
diff
changeset
|
682 self._check_index(rev) |
47255
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
683 if rev < self._lgt: |
46730
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
684 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:
46717
diff
changeset
|
685 raise KeyError(msg) |
47255
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
686 else: |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
687 entry = list(self[rev]) |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
688 entry[0] = offset_flags |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
689 entry[8] = sidedata_offset |
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
690 entry[9] = sidedata_length |
47270
07641bafa646
revlog: compress sidedata when doing "post-pull" sidedata update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47267
diff
changeset
|
691 entry[11] = compression_mode |
47255
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
692 entry = tuple(entry) |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
693 new = self._pack_entry(rev, entry) |
47255
78230d036e5d
revlog: simplify the replace_sidedata_info code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47254
diff
changeset
|
694 self._extra[rev - self._lgt] = new |
46730
502e795b55ac
revlog-index: add `replace_sidedata_info` method
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46717
diff
changeset
|
695 |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
696 def _unpack_entry(self, rev, data): |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
697 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:
47262
diff
changeset
|
698 entry = data[:10] |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
699 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:
47262
diff
changeset
|
700 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:
47262
diff
changeset
|
701 return entry + (data_comp, sidedata_comp) |
47156
4292bed8da7c
revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47095
diff
changeset
|
702 |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
703 def _pack_entry(self, rev, entry): |
47267
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
704 data = entry[:10] |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
705 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:
47262
diff
changeset
|
706 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:
47262
diff
changeset
|
707 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:
47262
diff
changeset
|
708 |
2b69555e4875
revlog: introduce a compression mode for sidedata in the revlog index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47262
diff
changeset
|
709 return self.index_format.pack(*data) |
47157
47ffc754989a
revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47156
diff
changeset
|
710 |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
711 def entry_binary(self, rev): |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
712 """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:
47055
diff
changeset
|
713 entry = self[rev] |
47278
55d280bc59fa
revlog: pass around the `rev` we deal with when packing/unpacking entry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
714 return self._pack_entry(rev, entry) |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47055
diff
changeset
|
715 |
47246
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
716 def pack_header(self, header): |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
717 """pack header information as binary""" |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
718 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:
47157
diff
changeset
|
719 msg %= header |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
720 raise error.ProgrammingError(msg) |
6b1eae313b2f
revlogv2: store version information in the docket only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47157
diff
changeset
|
721 |
46717
913485776542
revlog: introduce v2 format
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46674
diff
changeset
|
722 |
47281
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
723 class IndexChangelogV2(IndexObject2): |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
724 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:
47279
diff
changeset
|
725 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
726 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:
47279
diff
changeset
|
727 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:
47279
diff
changeset
|
728 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:
47279
diff
changeset
|
729 data_comp = items[8] & 3 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
730 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:
47279
diff
changeset
|
731 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:
47279
diff
changeset
|
732 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
733 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:
47279
diff
changeset
|
734 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:
47279
diff
changeset
|
735 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:
47279
diff
changeset
|
736 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:
47279
diff
changeset
|
737 data_comp = entry[10] & 3 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
738 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:
47279
diff
changeset
|
739 data += (data_comp | sidedata_comp,) |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
740 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:
47279
diff
changeset
|
741 |
25ce16bf724b
changelogv2: use a dedicated on disk format for changelogv2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47279
diff
changeset
|
742 |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
743 def parse_index_devel_nodemap(data, inline): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45951
diff
changeset
|
744 """like parse_index2, but alway return a PersistentNodeMapIndexObject""" |
44356
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
745 return PersistentNodeMapIndexObject(data), None |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
746 |
6f9e8e142cea
nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44035
diff
changeset
|
747 |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
748 def parse_dirstate(dmap, copymap, st): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
749 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
|
750 # 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
|
751 format = b">cllll" |
7945
94d7e14cfa42
pure/parsers: fix circular imports, import mercurial modules properly
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
752 e_size = struct.calcsize(format) |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
753 pos1 = 40 |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
754 l = len(st) |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
755 |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
756 # the inner loop |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
757 while pos1 < l: |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
758 pos2 = pos1 + e_size |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
759 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
|
760 pos1 = pos2 + e[4] |
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
761 f = st[pos2:pos1] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
762 if b'\0' in f: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
763 f, c = f.split(b'\0') |
7700
f410c552fa15
pure Python implementation of parsers.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
764 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
|
765 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
|
766 return parents |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
767 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
39245
diff
changeset
|
768 |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
769 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
|
770 now = int(now) |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
27339
diff
changeset
|
771 cs = stringio() |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
772 write = cs.write |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
773 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
|
774 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
|
775 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
|
776 # 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
|
777 # 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
|
778 # 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
|
779 # 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
|
780 # 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
|
781 # 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
|
782 # 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
|
783 # 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
|
784 # 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
|
785 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
|
786 |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
787 if f in copymap: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
788 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
|
789 e = _pack( |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
790 b">cllll", |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
791 e.v1_state(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
792 e.v1_mode(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
793 e.v1_size(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
794 e.v1_mtime(), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
795 len(f), |
80dc1d452993
dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47508
diff
changeset
|
796 ) |
18567
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
797 write(e) |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
798 write(f) |
194e63c1ccb9
dirstate: move pure python dirstate packing to pure/parsers.py
Siddharth Agarwal <sid0@fb.com>
parents:
17425
diff
changeset
|
799 return cs.getvalue() |