annotate mercurial/dirstatemap.py @ 47687:e59bd6723f2f

dirstate-map: factor out the change to _dirs and _alldirs on adding This logic is complicated enough to deserves its own function. So it now does. This will make it easier to reuse that logic in later changeset. Differential Revision: https://phab.mercurial-scm.org/D11129
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 15 Jul 2021 01:58:31 +0200
parents e43128ee436f
children b37ab6b5c438
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47501
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47489
diff changeset
1 # dirstatemap.py
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
2 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
3 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9678
diff changeset
4 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
6 from __future__ import absolute_import
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
7
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
8 import errno
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
9
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
10 from .i18n import _
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
11
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
12 from . import (
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
13 error,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
14 pathutil,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
15 policy,
30304
ba2c04059317 py3: use pycompat.ossep at certain places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30224
diff changeset
16 pycompat,
31050
206532700213 txnutil: factor out the logic to read file in according to HG_PENDING
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
17 txnutil,
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
18 util,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
19 )
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
21 from .dirstateutils import (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
22 docket as docketmod,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
23 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
24
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
25 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
26 rustmod = policy.importrust('dirstate')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
27
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
28 propertycache = util.propertycache
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
29
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47535
diff changeset
30 DirstateItem = parsers.DirstateItem
21808
7537e57f5dbd dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents: 21116
diff changeset
31
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
32
47482
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
33 # a special value used internally for `size` if the file come from the other parent
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
34 FROM_P2 = -2
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
35
47483
4ac418b4a6af dirstate: introduce a symbolic constant for the NONNORMAL marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47482
diff changeset
36 # a special value used internally for `size` if the file is modified/merged/added
4ac418b4a6af dirstate: introduce a symbolic constant for the NONNORMAL marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47482
diff changeset
37 NONNORMAL = -1
4ac418b4a6af dirstate: introduce a symbolic constant for the NONNORMAL marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47482
diff changeset
38
47484
3f13dfa1fa78 dirstate: introduce a symbolic constant for the AMBIGUOUS_TIME marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47483
diff changeset
39 # a special value used internally for `time` if the time is ambigeous
3f13dfa1fa78 dirstate: introduce a symbolic constant for the AMBIGUOUS_TIME marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47483
diff changeset
40 AMBIGUOUS_TIME = -1
3f13dfa1fa78 dirstate: introduce a symbolic constant for the AMBIGUOUS_TIME marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47483
diff changeset
41
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
42 rangemask = 0x7FFFFFFF
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
43
47482
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
44
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
45 class dirstatemap(object):
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
46 """Map encapsulating the dirstate's contents.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
47
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
48 The dirstate contains the following state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
49
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
50 - `identity` is the identity of the dirstate file, which can be used to
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
51 detect when changes have occurred to the dirstate file.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
52
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
53 - `parents` is a pair containing the parents of the working copy. The
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
54 parents are updated by calling `setparents`.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
55
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
56 - the state map maps filenames to tuples of (state, mode, size, mtime),
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
57 where state is a single character representing 'normal', 'added',
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
58 'removed', or 'merged'. It is read by treating the dirstate as a
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
59 dict. File state is updated by calling the `addfile`, `removefile` and
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
60 `dropfile` methods.
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
61
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
62 - `copymap` maps destination filenames to their source filename.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
63
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
64 The dirstate also provides the following views onto the state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
65
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
66 - `nonnormalset` is a set of the filenames that have state other
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
67 than 'normal', or are normal but have an mtime of -1 ('normallookup').
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
68
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
69 - `otherparentset` is a set of the filenames that are marked as coming
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
70 from the second parent when the dirstate is currently being merged.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
71
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
72 - `filefoldmap` is a dict mapping normalized filenames to the denormalized
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
73 form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
74
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
75 - `dirfoldmap` is a dict mapping normalized directory names to the
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
76 denormalized form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
77 """
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
78
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
79 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
80 self._ui = ui
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
81 self._opener = opener
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
82 self._root = root
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
83 self._filename = b'dirstate'
45219
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
84 self._nodelen = 20
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
85 self._nodeconstants = nodeconstants
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
86 assert (
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
87 not use_dirstate_v2
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
88 ), "should have detected unsupported requirement"
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
89
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
90 self._parents = None
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
91 self._dirtyparents = False
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
92
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
93 # for consistent view between _pl() and _read() invocations
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
94 self._pendingmode = None
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
95
34934
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
96 @propertycache
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
97 def _map(self):
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
98 self._map = {}
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
99 self.read()
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
100 return self._map
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
101
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
102 @propertycache
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
103 def copymap(self):
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
104 self.copymap = {}
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
105 self._map
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
106 return self.copymap
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
107
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
108 def clear(self):
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
109 self._map.clear()
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
110 self.copymap.clear()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
111 self.setparents(self._nodeconstants.nullid, self._nodeconstants.nullid)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
112 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
113 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
114 util.clearcachedproperty(self, b"filefoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
115 util.clearcachedproperty(self, b"dirfoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
116 util.clearcachedproperty(self, b"nonnormalset")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
117 util.clearcachedproperty(self, b"otherparentset")
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
118
35878
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
119 def items(self):
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
120 return pycompat.iteritems(self._map)
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
121
35878
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
122 # forward for python2,3 compat
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
123 iteritems = items
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
124
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
125 debug_iter = items
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
126
34408
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34339
diff changeset
127 def __len__(self):
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34339
diff changeset
128 return len(self._map)
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34339
diff changeset
129
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
130 def __iter__(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
131 return iter(self._map)
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
132
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
133 def get(self, key, default=None):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
134 return self._map.get(key, default)
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
135
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
136 def __contains__(self, key):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
137 return key in self._map
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
138
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
139 def __getitem__(self, key):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
140 return self._map[key]
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
141
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
142 def keys(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
143 return self._map.keys()
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
144
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
145 def preload(self):
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
146 """Loads the underlying data, if it's not already loaded"""
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
147 self._map
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
148
47687
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
149 def _dirs_incr(self, filename, old_entry=None):
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
150 """incremente the dirstate counter if applicable"""
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
151 if (
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
152 old_entry is None or old_entry.removed
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
153 ) and "_dirs" in self.__dict__:
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
154 self._dirs.addpath(filename)
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
155 if old_entry is None and "_alldirs" in self.__dict__:
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
156 self._alldirs.addpath(filename)
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
157
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
158 def addfile(
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
159 self,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
160 f,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
161 mode=0,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
162 size=None,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
163 mtime=None,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
164 added=False,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
165 merged=False,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
166 from_p2=False,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
167 possibly_dirty=False,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
168 ):
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
169 """Add a tracked file to the dirstate."""
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
170 if added:
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
171 assert not merged
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
172 assert not possibly_dirty
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
173 assert not from_p2
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
174 state = b'a'
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
175 size = NONNORMAL
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
176 mtime = AMBIGUOUS_TIME
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
177 elif merged:
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
178 assert not possibly_dirty
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
179 assert not from_p2
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
180 state = b'm'
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
181 size = FROM_P2
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
182 mtime = AMBIGUOUS_TIME
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
183 elif from_p2:
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
184 assert not possibly_dirty
47529
d3cf20328abd dirstate: infer the 'n' state from `from_p2`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47528
diff changeset
185 state = b'n'
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
186 size = FROM_P2
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
187 mtime = AMBIGUOUS_TIME
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
188 elif possibly_dirty:
47528
80617f3c0f9a dirstate: infer the 'n' state from `possibly_dirty`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47527
diff changeset
189 state = b'n'
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
190 size = NONNORMAL
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
191 mtime = AMBIGUOUS_TIME
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
192 else:
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
193 assert size != FROM_P2
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
194 assert size != NONNORMAL
47530
a1745a292885 dirstate: drop `state` to `_addpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47529
diff changeset
195 state = b'n'
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
196 size = size & rangemask
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
197 mtime = mtime & rangemask
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
198 assert state is not None
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
199 assert size is not None
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
200 assert mtime is not None
47524
69a463a4f193 dirstate: no longer pass the `oldstate` value to the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47521
diff changeset
201 old_entry = self.get(f)
47687
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
202 self._dirs_incr(f, old_entry)
47685
265cdfaad372 dirstate-item: introduce a `dm_nonnormal` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
203 e = self._map[f] = DirstateItem(state, mode, size, mtime)
265cdfaad372 dirstate-item: introduce a `dm_nonnormal` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
204 if e.dm_nonnormal:
35080
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
205 self.nonnormalset.add(f)
47686
e43128ee436f dirstate-item: introduce a `dm_otherparent` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47685
diff changeset
206 if e.dm_otherparent:
35080
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
207 self.otherparentset.add(f)
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
208
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
209 def removefile(self, f, in_merge=False):
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
210 """
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
211 Mark a file as removed in the dirstate.
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
212
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
213 The `size` parameter is used to store sentinel values that indicate
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
214 the file's previous state. In the future, we should refactor this
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
215 to be more explicit about what that state is.
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
216 """
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
217 entry = self.get(f)
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
218 size = 0
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
219 if in_merge:
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
220 # XXX we should not be able to have 'm' state and 'FROM_P2' if not
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
221 # during a merge. So I (marmoute) am not sure we need the
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
222 # conditionnal at all. Adding double checking this with assert
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
223 # would be nice.
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
224 if entry is not None:
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
225 # backup the previous state
47513
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47511
diff changeset
226 if entry.merged: # merge
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
227 size = NONNORMAL
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
228 elif entry.from_p2:
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
229 size = FROM_P2
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
230 self.otherparentset.add(f)
47672
0efaa1bbad2b dirstate-map: do not use `size` to gate copy dropping during remove_file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47668
diff changeset
231 if entry is not None and not (entry.merged or entry.from_p2):
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
232 self.copymap.pop(f, None)
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
233
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
234 if entry is not None and not entry.removed and "_dirs" in self.__dict__:
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
235 self._dirs.delpath(f)
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
236 if entry is None and "_alldirs" in self.__dict__:
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
237 self._alldirs.addpath(f)
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43456
diff changeset
238 if "filefoldmap" in self.__dict__:
35082
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35081
diff changeset
239 normed = util.normcase(f)
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35081
diff changeset
240 self.filefoldmap.pop(normed, None)
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47535
diff changeset
241 self._map[f] = DirstateItem(b'r', 0, size, 0)
35080
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
242 self.nonnormalset.add(f)
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
243
47535
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
244 def dropfile(self, f):
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
245 """
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
246 Remove a file from the dirstate. Returns True if the file was
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
247 previously recorded.
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
248 """
47535
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
249 old_entry = self._map.pop(f, None)
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
250 exists = False
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
251 oldstate = b'?'
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
252 if old_entry is not None:
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
253 exists = True
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
254 oldstate = old_entry.state
35081
a947cf872799 dirstate: move management of the dirstate dirs into the dirstatemap
Mark Thomas <mbthomas@fb.com>
parents: 35080
diff changeset
255 if exists:
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43456
diff changeset
256 if oldstate != b"r" and "_dirs" in self.__dict__:
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
257 self._dirs.delpath(f)
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43456
diff changeset
258 if "_alldirs" in self.__dict__:
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
259 self._alldirs.delpath(f)
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43456
diff changeset
260 if "filefoldmap" in self.__dict__:
35082
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35081
diff changeset
261 normed = util.normcase(f)
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35081
diff changeset
262 self.filefoldmap.pop(normed, None)
35080
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
263 self.nonnormalset.discard(f)
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
264 return exists
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
265
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
266 def clearambiguoustimes(self, files, now):
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
267 for f in files:
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
268 e = self.get(f)
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
269 if e is not None and e.need_delay(now):
47668
724a77979b47 dirstatemap: use `set_possibly_dirty` in `clearambiguoustimes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47542
diff changeset
270 e.set_possibly_dirty()
35080
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35079
diff changeset
271 self.nonnormalset.add(f)
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
272
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
273 def nonnormalentries(self):
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
274 '''Compute the nonnormal dirstate entries from the dmap'''
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
275 try:
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
276 return parsers.nonnormalotherparententries(self._map)
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
277 except AttributeError:
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
278 nonnorm = set()
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
279 otherparent = set()
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
280 for fname, e in pycompat.iteritems(self._map):
47685
265cdfaad372 dirstate-item: introduce a `dm_nonnormal` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
281 if e.dm_nonnormal:
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
282 nonnorm.add(fname)
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
283 if e.from_p2:
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
284 otherparent.add(fname)
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
285 return nonnorm, otherparent
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
286
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
287 @propertycache
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
288 def filefoldmap(self):
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
289 """Returns a dictionary mapping normalized case paths to their
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
290 non-normalized versions.
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
291 """
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
292 try:
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
293 makefilefoldmap = parsers.make_file_foldmap
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
294 except AttributeError:
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
295 pass
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
296 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
297 return makefilefoldmap(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
298 self._map, util.normcasespec, util.normcasefallback
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
299 )
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
300
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
301 f = {}
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
302 normcase = util.normcase
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
303 for name, s in pycompat.iteritems(self._map):
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
304 if not s.removed:
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
305 f[normcase(name)] = name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
306 f[b'.'] = b'.' # prevents useless util.fspath() invocation
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
307 return f
34335
af9722412ac3 dirstate: move _dirs to dirstatemap
Durham Goode <durham@fb.com>
parents: 34334
diff changeset
308
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
309 def hastrackeddir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
310 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
311 Returns True if the dirstate contains a tracked (not removed) file
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
312 in this directory.
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
313 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
314 return d in self._dirs
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
315
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
316 def hasdir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
317 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
318 Returns True if the dirstate contains a file (tracked or removed)
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
319 in this directory.
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
320 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
321 return d in self._alldirs
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
322
34677
014bd2a555c8 dirstate: remove _dirs property cache
Durham Goode <durham@fb.com>
parents: 34676
diff changeset
323 @propertycache
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
324 def _dirs(self):
43523
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
325 return pathutil.dirs(self._map, b'r')
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
326
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
327 @propertycache
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
328 def _alldirs(self):
43523
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
329 return pathutil.dirs(self._map)
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
330
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
331 def _opendirstatefile(self):
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
332 fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
333 if self._pendingmode is not None and self._pendingmode != mode:
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
334 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
335 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
336 _(b'working directory state may be changed parallelly')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
337 )
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
338 self._pendingmode = mode
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
339 return fp
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
340
34338
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34337
diff changeset
341 def parents(self):
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
342 if not self._parents:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
343 try:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
344 fp = self._opendirstatefile()
45219
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
345 st = fp.read(2 * self._nodelen)
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
346 fp.close()
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
347 except IOError as err:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
348 if err.errno != errno.ENOENT:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
349 raise
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
350 # File doesn't exist, so the current state is empty
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
351 st = b''
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
352
34338
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34337
diff changeset
353 l = len(st)
45219
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
354 if l == self._nodelen * 2:
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
355 self._parents = (
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
356 st[: self._nodelen],
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
357 st[self._nodelen : 2 * self._nodelen],
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
358 )
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
359 elif l == 0:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
360 self._parents = (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
361 self._nodeconstants.nullid,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
362 self._nodeconstants.nullid,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
363 )
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
364 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
365 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
366 _(b'working directory state appears damaged!')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
367 )
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
368
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
369 return self._parents
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
370
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
371 def setparents(self, p1, p2):
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
372 self._parents = (p1, p2)
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
373 self._dirtyparents = True
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
374
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
375 def read(self):
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
376 # ignore HG_PENDING because identity is used only for writing
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
377 self.identity = util.filestat.frompath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
378 self._opener.join(self._filename)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
379 )
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
380
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
381 try:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
382 fp = self._opendirstatefile()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
383 try:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
384 st = fp.read()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
385 finally:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
386 fp.close()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
387 except IOError as err:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
388 if err.errno != errno.ENOENT:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
389 raise
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
390 return
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
391 if not st:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
392 return
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
393
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
394 if util.safehasattr(parsers, b'dict_new_presized'):
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
395 # Make an estimate of the number of files in the dirstate based on
45243
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
396 # its size. This trades wasting some memory for avoiding costly
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
397 # resizes. Each entry have a prefix of 17 bytes followed by one or
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
398 # two path names. Studies on various large-scale real-world repositories
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
399 # found 54 bytes a reasonable upper limit for the average path names.
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
400 # Copy entries are ignored for the sake of this estimate.
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
401 self._map = parsers.dict_new_presized(len(st) // 71)
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
402
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
403 # Python's garbage collector triggers a GC each time a certain number
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
404 # of container objects (the number being defined by
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
405 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
406 # for each file in the dirstate. The C version then immediately marks
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
407 # them as not to be tracked by the collector. However, this has no
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
408 # effect on when GCs are triggered, only on what objects the GC looks
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
409 # into. This means that O(number of files) GCs are unavoidable.
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
410 # Depending on when in the process's lifetime the dirstate is parsed,
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
411 # this can get very expensive. As a workaround, disable GC while
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
412 # parsing the dirstate.
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
413 #
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
414 # (we cannot decorate the function directly since it is in a C module)
42747
760a7851e9ba rust-parsers: move parser bindings to their own file and Python module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42456
diff changeset
415 parse_dirstate = util.nogc(parsers.parse_dirstate)
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
416 p = parse_dirstate(self._map, self.copymap, st)
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
417 if not self._dirtyparents:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
418 self.setparents(*p)
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
419
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
420 # Avoid excess attribute lookups by fast pathing certain checks
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
421 self.__contains__ = self._map.__contains__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
422 self.__getitem__ = self._map.__getitem__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
423 self.get = self._map.get
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
424
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
425 def write(self, _tr, st, now):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
426 st.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
427 parsers.pack_dirstate(self._map, self.copymap, self.parents(), now)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
428 )
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
429 st.close()
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
430 self._dirtyparents = False
34674
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
431 self.nonnormalset, self.otherparentset = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
432
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
433 @propertycache
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
434 def nonnormalset(self):
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
435 nonnorm, otherparents = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
436 self.otherparentset = otherparents
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
437 return nonnorm
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
438
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
439 @propertycache
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
440 def otherparentset(self):
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
441 nonnorm, otherparents = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
442 self.nonnormalset = nonnorm
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
443 return otherparents
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
444
47094
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
445 def non_normal_or_other_parent_paths(self):
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
446 return self.nonnormalset.union(self.otherparentset)
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
447
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
448 @propertycache
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
449 def identity(self):
34934
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
450 self._map
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
451 return self.identity
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
452
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
453 @propertycache
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
454 def dirfoldmap(self):
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
455 f = {}
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
456 normcase = util.normcase
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
457 for name in self._dirs:
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
458 f[normcase(name)] = name
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
459 return f
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
460
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
461
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
462 if rustmod is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
463
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
464 class dirstatemap(object):
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
465 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
466 self._use_dirstate_v2 = use_dirstate_v2
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
467 self._nodeconstants = nodeconstants
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
468 self._ui = ui
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
469 self._opener = opener
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
470 self._root = root
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
471 self._filename = b'dirstate'
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
472 self._nodelen = 20 # Also update Rust code when changing this!
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
473 self._parents = None
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
474 self._dirtyparents = False
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
475 self._docket = None
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
476
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
477 # for consistent view between _pl() and _read() invocations
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
478 self._pendingmode = None
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
479
47320
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
480 self._use_dirstate_tree = self._ui.configbool(
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
481 b"experimental",
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
482 b"dirstate-tree.in-memory",
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
483 False,
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
484 )
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
485
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
486 def addfile(
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
487 self,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
488 f,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
489 mode=0,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
490 size=None,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
491 mtime=None,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
492 added=False,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
493 merged=False,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
494 from_p2=False,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
495 possibly_dirty=False,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
496 ):
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
497 return self._rustmap.addfile(
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
498 f,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
499 mode,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
500 size,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
501 mtime,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
502 added,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
503 merged,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
504 from_p2,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
505 possibly_dirty,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
506 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
507
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
508 def removefile(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
509 return self._rustmap.removefile(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
510
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
511 def dropfile(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
512 return self._rustmap.dropfile(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
513
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
514 def clearambiguoustimes(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
515 return self._rustmap.clearambiguoustimes(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
516
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
517 def nonnormalentries(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
518 return self._rustmap.nonnormalentries()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
519
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
520 def get(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
521 return self._rustmap.get(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
522
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
523 @property
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
524 def copymap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
525 return self._rustmap.copymap()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
526
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47350
diff changeset
527 def directories(self):
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47350
diff changeset
528 return self._rustmap.directories()
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47350
diff changeset
529
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
530 def debug_iter(self):
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
531 return self._rustmap.debug_iter()
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
532
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
533 def preload(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
534 self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
535
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
536 def clear(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
537 self._rustmap.clear()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
538 self.setparents(
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
539 self._nodeconstants.nullid, self._nodeconstants.nullid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
540 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
541 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
542 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
543 util.clearcachedproperty(self, b"dirfoldmap")
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
544
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
545 def items(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
546 return self._rustmap.items()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
547
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
548 def keys(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
549 return iter(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
550
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
551 def __contains__(self, key):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
552 return key in self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
553
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
554 def __getitem__(self, item):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
555 return self._rustmap[item]
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
556
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
557 def __len__(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
558 return len(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
559
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
560 def __iter__(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
561 return iter(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
562
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
563 # forward for python2,3 compat
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
564 iteritems = items
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
565
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
566 def _opendirstatefile(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
567 fp, mode = txnutil.trypending(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
568 self._root, self._opener, self._filename
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
569 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
570 if self._pendingmode is not None and self._pendingmode != mode:
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
571 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
572 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
573 _(b'working directory state may be changed parallelly')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
574 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
575 self._pendingmode = mode
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
576 return fp
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
577
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
578 def _readdirstatefile(self, size=-1):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
579 try:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
580 with self._opendirstatefile() as fp:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
581 return fp.read(size)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
582 except IOError as err:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
583 if err.errno != errno.ENOENT:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
584 raise
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
585 # File doesn't exist, so the current state is empty
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
586 return b''
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
587
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
588 def setparents(self, p1, p2):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
589 self._parents = (p1, p2)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
590 self._dirtyparents = True
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
591
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
592 def parents(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
593 if not self._parents:
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
594 if self._use_dirstate_v2:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
595 self._parents = self.docket.parents
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
596 else:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
597 read_len = self._nodelen * 2
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
598 st = self._readdirstatefile(read_len)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
599 l = len(st)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
600 if l == read_len:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
601 self._parents = (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
602 st[: self._nodelen],
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
603 st[self._nodelen : 2 * self._nodelen],
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
604 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
605 elif l == 0:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
606 self._parents = (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
607 self._nodeconstants.nullid,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
608 self._nodeconstants.nullid,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
609 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
610 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
611 raise error.Abort(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
612 _(b'working directory state appears damaged!')
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
613 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
614
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
615 return self._parents
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
616
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
617 @property
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
618 def docket(self):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
619 if not self._docket:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
620 if not self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
621 raise error.ProgrammingError(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
622 b'dirstate only has a docket in v2 format'
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
623 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
624 self._docket = docketmod.DirstateDocket.parse(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
625 self._readdirstatefile(), self._nodeconstants
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
626 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
627 return self._docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
628
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
629 @propertycache
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
630 def _rustmap(self):
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
631 """
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
632 Fills the Dirstatemap when called.
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
633 """
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
634 # ignore HG_PENDING because identity is used only for writing
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
635 self.identity = util.filestat.frompath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
636 self._opener.join(self._filename)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
637 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
638
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
639 if self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
640 if self.docket.uuid:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
641 # TODO: use mmap when possible
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
642 data = self._opener.read(self.docket.data_filename())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
643 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
644 data = b''
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
645 self._rustmap = rustmod.DirstateMap.new_v2(
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
646 data, self.docket.data_size, self.docket.tree_metadata
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
647 )
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
648 parents = self.docket.parents
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
649 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
650 self._rustmap, parents = rustmod.DirstateMap.new_v1(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
651 self._use_dirstate_tree, self._readdirstatefile()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
652 )
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
653
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
654 if parents and not self._dirtyparents:
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
655 self.setparents(*parents)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
656
43280
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43274
diff changeset
657 self.__contains__ = self._rustmap.__contains__
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43274
diff changeset
658 self.__getitem__ = self._rustmap.__getitem__
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43274
diff changeset
659 self.get = self._rustmap.get
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
660 return self._rustmap
43280
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43274
diff changeset
661
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
662 def write(self, tr, st, now):
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
663 if not self._use_dirstate_v2:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
664 p1, p2 = self.parents()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
665 packed = self._rustmap.write_v1(p1, p2, now)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
666 st.write(packed)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
667 st.close()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
668 self._dirtyparents = False
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
669 return
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
670
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
671 # We can only append to an existing data file if there is one
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
672 can_append = self.docket.uuid is not None
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
673 packed, meta, append = self._rustmap.write_v2(now, can_append)
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
674 if append:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
675 docket = self.docket
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
676 data_filename = docket.data_filename()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
677 if tr:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
678 tr.add(data_filename, docket.data_size)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
679 with self._opener(data_filename, b'r+b') as fp:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
680 fp.seek(docket.data_size)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
681 assert fp.tell() == docket.data_size
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
682 written = fp.write(packed)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
683 if written is not None: # py2 may return None
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
684 assert written == len(packed), (written, len(packed))
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
685 docket.data_size += len(packed)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
686 docket.parents = self.parents()
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
687 docket.tree_metadata = meta
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
688 st.write(docket.serialize())
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
689 st.close()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
690 else:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
691 old_docket = self.docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
692 new_docket = docketmod.DirstateDocket.with_new_uuid(
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
693 self.parents(), len(packed), meta
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
694 )
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
695 data_filename = new_docket.data_filename()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
696 if tr:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
697 tr.add(data_filename, 0)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
698 self._opener.write(data_filename, packed)
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
699 # Write the new docket after the new data file has been
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
700 # written. Because `st` was opened with `atomictemp=True`,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
701 # the actual `.hg/dirstate` file is only affected on close.
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
702 st.write(new_docket.serialize())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
703 st.close()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
704 # Remove the old data file after the new docket pointing to
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
705 # the new data file was written.
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
706 if old_docket.uuid:
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
707 data_filename = old_docket.data_filename()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
708 unlink = lambda _tr=None: self._opener.unlink(data_filename)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
709 if tr:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
710 category = b"dirstate-v2-clean-" + old_docket.uuid
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
711 tr.addpostclose(category, unlink)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
712 else:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
713 unlink()
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
714 self._docket = new_docket
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
715 # Reload from the newly-written file
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
716 util.clearcachedproperty(self, b"_rustmap")
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
717 self._dirtyparents = False
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
718
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
719 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
720 def filefoldmap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
721 """Returns a dictionary mapping normalized case paths to their
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
722 non-normalized versions.
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
723 """
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
724 return self._rustmap.filefoldmapasdict()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
725
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
726 def hastrackeddir(self, d):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
727 return self._rustmap.hastrackeddir(d)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
728
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
729 def hasdir(self, d):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
730 return self._rustmap.hasdir(d)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
731
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
732 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
733 def identity(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
734 self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
735 return self.identity
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
736
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
737 @property
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
738 def nonnormalset(self):
44297
cf1f8660e568 rust-dirstatemap: add `NonNormalEntries` class
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44227
diff changeset
739 nonnorm = self._rustmap.non_normal_entries()
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
740 return nonnorm
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
741
44227
7f5410dfc8a6 rust-dirstatemap: add missing @propertycache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44078
diff changeset
742 @propertycache
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
743 def otherparentset(self):
44297
cf1f8660e568 rust-dirstatemap: add `NonNormalEntries` class
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44227
diff changeset
744 otherparents = self._rustmap.other_parent_entries()
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
745 return otherparents
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
746
47094
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
747 def non_normal_or_other_parent_paths(self):
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
748 return self._rustmap.non_normal_or_other_parent_paths()
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
749
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
750 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
751 def dirfoldmap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
752 f = {}
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
753 normcase = util.normcase
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
754 for name in self._rustmap.tracked_dirs():
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
755 f[normcase(name)] = name
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42747
diff changeset
756 return f