annotate mercurial/dirstatemap.py @ 47674:ff97e793ed36

dirstate-v2: Introduce a docket file .hg/dirstate now only contains some metadata to point to a separate data file named .hg/dirstate.{}.d with a random hexadecimal identifier. For now every update creates a new data file and removes the old one, but later we’ll (usually) append to an existing file. Separating into two files allows doing the "write to a temporary file then atomically rename into destination" dance with only a small docket file, without always rewriting a lot of data. Differential Revision: https://phab.mercurial-scm.org/D11088
author Simon Sapin <simon.sapin@octobus.net>
date Thu, 08 Jul 2021 12:18:21 +0200
parents 0efaa1bbad2b
children 48aec076b8fb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47506
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47494
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,
32411
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32391
diff changeset
15 policy,
30317
ba2c04059317 py3: use pycompat.ossep at certain places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30224
diff changeset
16 pycompat,
31070
206532700213 txnutil: factor out the logic to read file in according to HG_PENDING
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30639
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
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43553
diff changeset
25 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43553
diff changeset
26 rustmod = policy.importrust('dirstate')
32411
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32391
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: 42931
diff changeset
32
47487
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47486
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: 47486
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: 47486
diff changeset
35
47488
4ac418b4a6af dirstate: introduce a symbolic constant for the NONNORMAL marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47487
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: 47487
diff changeset
37 NONNORMAL = -1
4ac418b4a6af dirstate: introduce a symbolic constant for the NONNORMAL marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47487
diff changeset
38
47489
3f13dfa1fa78 dirstate: introduce a symbolic constant for the AMBIGUOUS_TIME marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47488
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: 47488
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: 47488
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
47487
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47486
diff changeset
44
34339
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
45 class dirstatemap(object):
35101
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
46 """Map encapsulating the dirstate's contents.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
47
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
48 The dirstate contains the following state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
49
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
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: 35055
diff changeset
51 detect when changes have occurred to the dirstate file.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
52
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
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: 35055
diff changeset
54 parents are updated by calling `setparents`.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
55
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
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: 35055
diff changeset
57 where state is a single character representing 'normal', 'added',
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
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: 35101
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: 35101
diff changeset
60 `dropfile` methods.
35101
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
61
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
62 - `copymap` maps destination filenames to their source filename.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
63
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
64 The dirstate also provides the following views onto the state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
65
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
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: 35055
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: 35055
diff changeset
68
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
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: 35055
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: 35055
diff changeset
71
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
72 - `filefoldmap` is a dict mapping normalized filenames to the denormalized
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
73 form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
74
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
75 - `dirfoldmap` is a dict mapping normalized directory names to the
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
76 denormalized form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
77 """
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35055
diff changeset
78
47291
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
diff changeset
79 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
34344
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
80 self._ui = ui
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
81 self._opener = opener
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
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'
45252
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
84 self._nodelen = 20
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
85 self._nodeconstants = nodeconstants
47291
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
diff changeset
86 assert (
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
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: 47288
diff changeset
88 ), "should have detected unsupported requirement"
34344
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
89
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
90 self._parents = None
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
91 self._dirtyparents = False
34339
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
92
34344
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
93 # for consistent view between _pl() and _read() invocations
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
94 self._pendingmode = None
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
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
47357
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
108 def directories(self):
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
109 # Rust / dirstate-v2 only
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
110 return []
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
111
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
112 def clear(self):
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
113 self._map.clear()
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
114 self.copymap.clear()
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
115 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
116 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
117 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
118 util.clearcachedproperty(self, b"filefoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
119 util.clearcachedproperty(self, b"dirfoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
120 util.clearcachedproperty(self, b"nonnormalset")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
121 util.clearcachedproperty(self, b"otherparentset")
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
122
35918
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35875
diff changeset
123 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
124 return pycompat.iteritems(self._map)
34339
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
125
35918
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35875
diff changeset
126 # forward for python2,3 compat
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35875
diff changeset
127 iteritems = items
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35875
diff changeset
128
34409
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34346
diff changeset
129 def __len__(self):
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34346
diff changeset
130 return len(self._map)
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34346
diff changeset
131
34339
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
132 def __iter__(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
133 return iter(self._map)
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
134
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
135 def get(self, key, default=None):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
136 return self._map.get(key, default)
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
137
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
138 def __contains__(self, key):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
139 return key in self._map
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
140
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
141 def __getitem__(self, key):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
142 return self._map[key]
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
143
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
144 def keys(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34200
diff changeset
145 return self._map.keys()
34340
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
146
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
147 def preload(self):
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
148 """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
149 self._map
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
150
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
151 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
152 self,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
153 f,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
154 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
155 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
156 mtime=None,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
157 added=False,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
158 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
159 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
160 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
161 ):
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
162 """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
163 if added:
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
164 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
165 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
166 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
167 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
168 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
169 mtime = AMBIGUOUS_TIME
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
170 elif merged:
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
171 assert not possibly_dirty
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
172 assert not from_p2
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
173 state = b'm'
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
174 size = FROM_P2
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
175 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
176 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
177 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
178 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
179 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
180 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
181 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
182 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
183 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
184 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
185 else:
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
186 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
187 assert size != NONNORMAL
47530
a1745a292885 dirstate: drop `state` to `_addpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47529
diff changeset
188 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
189 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
190 mtime = mtime & rangemask
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
191 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
192 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
193 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
194 old_entry = self.get(f)
69a463a4f193 dirstate: no longer pass the `oldstate` value to the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47521
diff changeset
195 if (
69a463a4f193 dirstate: no longer pass the `oldstate` value to the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47521
diff changeset
196 old_entry is None or old_entry.removed
69a463a4f193 dirstate: no longer pass the `oldstate` value to the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47521
diff changeset
197 ) and "_dirs" in self.__dict__:
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
198 self._dirs.addpath(f)
47524
69a463a4f193 dirstate: no longer pass the `oldstate` value to the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47521
diff changeset
199 if old_entry is None and "_alldirs" in self.__dict__:
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
200 self._alldirs.addpath(f)
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47535
diff changeset
201 self._map[f] = DirstateItem(state, mode, size, mtime)
47489
3f13dfa1fa78 dirstate: introduce a symbolic constant for the AMBIGUOUS_TIME marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47488
diff changeset
202 if state != b'n' or mtime == AMBIGUOUS_TIME:
35103
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
203 self.nonnormalset.add(f)
47487
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47486
diff changeset
204 if size == FROM_P2:
35103
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
205 self.otherparentset.add(f)
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
206
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
207 def removefile(self, f, in_merge=False):
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
208 """
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
209 Mark a file as removed in the dirstate.
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
210
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
211 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: 35101
diff changeset
212 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: 35101
diff changeset
213 to be more explicit about what that state is.
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
214 """
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
215 entry = self.get(f)
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
216 size = 0
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
217 if in_merge:
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
218 # 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: 47506
diff changeset
219 # 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: 47506
diff changeset
220 # 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: 47506
diff changeset
221 # would be nice.
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
222 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: 47506
diff changeset
223 # backup the previous state
47513
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47511
diff changeset
224 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: 47506
diff changeset
225 size = NONNORMAL
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
226 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: 47506
diff changeset
227 size = FROM_P2
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47506
diff changeset
228 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
229 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: 47506
diff changeset
230 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: 47506
diff changeset
231
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
232 if entry is not None and not entry.removed and "_dirs" in self.__dict__:
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
233 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: 47506
diff changeset
234 if entry is None and "_alldirs" in self.__dict__:
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
235 self._alldirs.addpath(f)
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43508
diff changeset
236 if "filefoldmap" in self.__dict__:
35105
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35104
diff changeset
237 normed = util.normcase(f)
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35104
diff changeset
238 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
239 self._map[f] = DirstateItem(b'r', 0, size, 0)
35103
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
240 self.nonnormalset.add(f)
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
241
47535
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
242 def dropfile(self, f):
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
243 """
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
244 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: 35101
diff changeset
245 previously recorded.
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
246 """
47535
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
247 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
248 exists = False
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
249 oldstate = b'?'
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
250 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
251 exists = True
6025353c9c55 dirstate: no longer pass `oldstate` to the `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
252 oldstate = old_entry.state
35104
a947cf872799 dirstate: move management of the dirstate dirs into the dirstatemap
Mark Thomas <mbthomas@fb.com>
parents: 35103
diff changeset
253 if exists:
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43508
diff changeset
254 if oldstate != b"r" and "_dirs" in self.__dict__:
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
255 self._dirs.delpath(f)
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43508
diff changeset
256 if "_alldirs" in self.__dict__:
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
257 self._alldirs.delpath(f)
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43508
diff changeset
258 if "filefoldmap" in self.__dict__:
35105
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35104
diff changeset
259 normed = util.normcase(f)
e6c64744781f dirstate: move dropping of folded filenames into the dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35104
diff changeset
260 self.filefoldmap.pop(normed, None)
35103
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
261 self.nonnormalset.discard(f)
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
262 return exists
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
263
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
264 def clearambiguoustimes(self, files, now):
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
265 for f in files:
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
266 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
267 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
268 e.set_possibly_dirty()
35103
19b75779b7c3 dirstate: move management of nonnormal sets into dirstate map
Mark Thomas <mbthomas@fb.com>
parents: 35102
diff changeset
269 self.nonnormalset.add(f)
35102
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35101
diff changeset
270
34340
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
271 def nonnormalentries(self):
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
272 '''Compute the nonnormal dirstate entries from the dmap'''
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
273 try:
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
274 return parsers.nonnormalotherparententries(self._map)
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
275 except AttributeError:
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
276 nonnorm = set()
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
277 otherparent = set()
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
278 for fname, e 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
279 if e.state != b'n' or e.mtime == AMBIGUOUS_TIME:
34340
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
280 nonnorm.add(fname)
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
281 if e.from_p2:
34340
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
282 otherparent.add(fname)
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
283 return nonnorm, otherparent
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34339
diff changeset
284
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
285 @propertycache
34341
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
286 def filefoldmap(self):
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
287 """Returns a dictionary mapping normalized case paths to their
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
288 non-normalized versions.
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
289 """
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
290 try:
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
291 makefilefoldmap = parsers.make_file_foldmap
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
292 except AttributeError:
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
293 pass
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
294 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
295 return makefilefoldmap(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
296 self._map, util.normcasespec, util.normcasefallback
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
297 )
34341
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
298
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
299 f = {}
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
300 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
301 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
302 if not s.removed:
34341
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
303 f[normcase(name)] = name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
304 f[b'.'] = b'.' # prevents useless util.fspath() invocation
34341
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34340
diff changeset
305 return f
34342
af9722412ac3 dirstate: move _dirs to dirstatemap
Durham Goode <durham@fb.com>
parents: 34341
diff changeset
306
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
307 def hastrackeddir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
308 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
309 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: 35106
diff changeset
310 in this directory.
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
311 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
312 return d in self._dirs
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
313
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
314 def hasdir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
315 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
316 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: 35106
diff changeset
317 in this directory.
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
318 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
319 return d in self._alldirs
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
320
34677
014bd2a555c8 dirstate: remove _dirs property cache
Durham Goode <durham@fb.com>
parents: 34676
diff changeset
321 @propertycache
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
322 def _dirs(self):
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
323 return pathutil.dirs(self._map, b'r')
34344
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
324
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
325 @propertycache
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
326 def _alldirs(self):
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
327 return pathutil.dirs(self._map)
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
328
34344
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
329 def _opendirstatefile(self):
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
330 fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
331 if self._pendingmode is not None and self._pendingmode != mode:
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
332 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
333 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
334 _(b'working directory state may be changed parallelly')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
335 )
34344
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
336 self._pendingmode = mode
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
337 return fp
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34343
diff changeset
338
34345
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34344
diff changeset
339 def parents(self):
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
340 if not self._parents:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
341 try:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
342 fp = self._opendirstatefile()
45252
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
343 st = fp.read(2 * self._nodelen)
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
344 fp.close()
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
345 except IOError as err:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
346 if err.errno != errno.ENOENT:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
347 raise
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
348 # 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
349 st = b''
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
350
34345
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34344
diff changeset
351 l = len(st)
45252
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
352 if l == self._nodelen * 2:
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
353 self._parents = (
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
354 st[: self._nodelen],
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
355 st[self._nodelen : 2 * self._nodelen],
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44911
diff changeset
356 )
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
357 elif l == 0:
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
358 self._parents = (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
359 self._nodeconstants.nullid,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
360 self._nodeconstants.nullid,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
361 )
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
362 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
363 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
364 _(b'working directory state appears damaged!')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
365 )
34346
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
366
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
367 return self._parents
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
368
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
369 def setparents(self, p1, p2):
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
370 self._parents = (p1, p2)
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34345
diff changeset
371 self._dirtyparents = True
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
372
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
373 def read(self):
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
374 # 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
375 self.identity = util.filestat.frompath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
376 self._opener.join(self._filename)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
377 )
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
378
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
379 try:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
380 fp = self._opendirstatefile()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
381 try:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
382 st = fp.read()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
383 finally:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
384 fp.close()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
385 except IOError as err:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
386 if err.errno != errno.ENOENT:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
387 raise
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
388 return
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
389 if not st:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
390 return
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
391
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
392 if util.safehasattr(parsers, b'dict_new_presized'):
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
393 # Make an estimate of the number of files in the dirstate based on
45269
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45267
diff changeset
394 # its size. This trades wasting some memory for avoiding costly
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45267
diff changeset
395 # 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: 45267
diff changeset
396 # 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: 45267
diff changeset
397 # 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: 45267
diff changeset
398 # Copy entries are ignored for the sake of this estimate.
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45267
diff changeset
399 self._map = parsers.dict_new_presized(len(st) // 71)
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
400
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
401 # Python's garbage collector triggers a GC each time a certain number
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
402 # of container objects (the number being defined by
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
403 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
404 # for each file in the dirstate. The C version then immediately marks
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
405 # 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: 34481
diff changeset
406 # 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: 34481
diff changeset
407 # into. This means that O(number of files) GCs are unavoidable.
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
408 # Depending on when in the process's lifetime the dirstate is parsed,
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
409 # this can get very expensive. As a workaround, disable GC while
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
410 # parsing the dirstate.
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
411 #
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
412 # (we cannot decorate the function directly since it is in a C module)
42763
760a7851e9ba rust-parsers: move parser bindings to their own file and Python module
Raphaël Gomès <rgomes@octobus.net>
parents: 42472
diff changeset
413 parse_dirstate = util.nogc(parsers.parse_dirstate)
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
414 p = parse_dirstate(self._map, self.copymap, st)
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
415 if not self._dirtyparents:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34481
diff changeset
416 self.setparents(*p)
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
417
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
418 # 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
419 self.__contains__ = self._map.__contains__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
420 self.__getitem__ = self._map.__getitem__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
421 self.get = self._map.get
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
422
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
423 def write(self, _tr, st, now):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
424 st.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
425 parsers.pack_dirstate(self._map, self.copymap, self.parents(), now)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
426 )
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
427 st.close()
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
428 self._dirtyparents = False
34674
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
429 self.nonnormalset, self.otherparentset = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
430
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
431 @propertycache
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
432 def nonnormalset(self):
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
433 nonnorm, otherparents = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
434 self.otherparentset = otherparents
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
435 return nonnorm
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
436
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
437 @propertycache
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
438 def otherparentset(self):
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
439 nonnorm, otherparents = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
440 self.nonnormalset = nonnorm
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
441 return otherparents
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
442
47108
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47055
diff changeset
443 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: 47055
diff changeset
444 return self.nonnormalset.union(self.otherparentset)
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47055
diff changeset
445
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
446 @propertycache
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
447 def identity(self):
34934
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
448 self._map
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
449 return self.identity
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
450
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
451 @propertycache
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
452 def dirfoldmap(self):
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
453 f = {}
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
454 normcase = util.normcase
35107
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35106
diff changeset
455 for name in self._dirs:
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
456 f[normcase(name)] = name
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
457 return f
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
458
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
459
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
460 if rustmod is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
461
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
462 class dirstatemap(object):
47291
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
diff changeset
463 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: 47288
diff changeset
464 self._use_dirstate_v2 = use_dirstate_v2
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
465 self._nodeconstants = nodeconstants
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
466 self._ui = ui
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
467 self._opener = opener
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
468 self._root = root
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
469 self._filename = b'dirstate'
47291
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
diff changeset
470 self._nodelen = 20 # Also update Rust code when changing this!
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
471 self._parents = None
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
472 self._dirtyparents = False
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
473 self._docket = None
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
474
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
475 # for consistent view between _pl() and _read() invocations
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
476 self._pendingmode = None
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
477
47328
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47291
diff changeset
478 self._use_dirstate_tree = self._ui.configbool(
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47291
diff changeset
479 b"experimental",
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47291
diff changeset
480 b"dirstate-tree.in-memory",
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47291
diff changeset
481 False,
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47291
diff changeset
482 )
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47291
diff changeset
483
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
484 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
485 self,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
486 f,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
487 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
488 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
489 mtime=None,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
490 added=False,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
491 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
492 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
493 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
494 ):
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
495 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
496 f,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
497 mode,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
498 size,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
499 mtime,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
500 added,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
501 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
502 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
503 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
504 )
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
505
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
506 def removefile(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
507 return self._rustmap.removefile(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
508
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
509 def dropfile(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
510 return self._rustmap.dropfile(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
511
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
512 def clearambiguoustimes(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
513 return self._rustmap.clearambiguoustimes(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
514
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
515 def nonnormalentries(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
516 return self._rustmap.nonnormalentries()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
517
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
518 def get(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
519 return self._rustmap.get(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
520
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
521 @property
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
522 def copymap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
523 return self._rustmap.copymap()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
524
47357
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
525 def directories(self):
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
526 return self._rustmap.directories()
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47356
diff changeset
527
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
528 def preload(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
529 self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
530
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
531 def clear(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
532 self._rustmap.clear()
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
533 self.setparents(
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
534 self._nodeconstants.nullid, self._nodeconstants.nullid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
535 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
536 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
537 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
538 util.clearcachedproperty(self, b"dirfoldmap")
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
539
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
540 def items(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
541 return self._rustmap.items()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
542
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
543 def keys(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
544 return iter(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
545
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
546 def __contains__(self, key):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
547 return key in self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
548
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
549 def __getitem__(self, item):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
550 return self._rustmap[item]
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
551
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
552 def __len__(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
553 return len(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
554
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
555 def __iter__(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
556 return iter(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
557
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
558 # forward for python2,3 compat
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
559 iteritems = items
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
560
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
561 def _opendirstatefile(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
562 fp, mode = txnutil.trypending(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
563 self._root, self._opener, self._filename
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
564 )
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
565 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: 42763
diff changeset
566 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
567 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
568 _(b'working directory state may be changed parallelly')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
569 )
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
570 self._pendingmode = mode
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
571 return fp
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
572
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
573 def _readdirstatefile(self, size=-1):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
574 try:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
575 with self._opendirstatefile() as fp:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
576 return fp.read(size)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
577 except IOError as err:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
578 if err.errno != errno.ENOENT:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
579 raise
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
580 # 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
581 return b''
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
582
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
583 def setparents(self, p1, p2):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
584 self._parents = (p1, p2)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
585 self._dirtyparents = True
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
586
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
587 def parents(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
588 if not self._parents:
47291
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
diff changeset
589 if self._use_dirstate_v2:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
590 self._parents = self.docket.parents
47291
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47288
diff changeset
591 else:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
592 read_len = self._nodelen * 2
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
593 st = self._readdirstatefile(read_len)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
594 l = len(st)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
595 if l == read_len:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
596 self._parents = (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
597 st[: self._nodelen],
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
598 st[self._nodelen : 2 * self._nodelen],
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
599 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
600 elif l == 0:
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 self._nodeconstants.nullid,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
603 self._nodeconstants.nullid,
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 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
606 raise error.Abort(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
607 _(b'working directory state appears damaged!')
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
608 )
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
609
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
610 return self._parents
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
611
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
612 @property
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
613 def docket(self):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
614 if not self._docket:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
615 if not self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
616 raise error.ProgrammingError(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
617 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
618 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
619 self._docket = docketmod.DirstateDocket.parse(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
620 self._readdirstatefile(), self._nodeconstants
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
621 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
622 return self._docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
623
47136
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
624 @propertycache
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
625 def _rustmap(self):
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
626 """
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
627 Fills the Dirstatemap when called.
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
628 """
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
629 # 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: 42763
diff changeset
630 self.identity = util.filestat.frompath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
631 self._opener.join(self._filename)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42931
diff changeset
632 )
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
633
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
634 if self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
635 if self.docket.uuid:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
636 # TODO: use mmap when possible
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
637 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
638 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
639 data = b''
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
640 self._rustmap = rustmod.DirstateMap.new_v2(data)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
641 parents = self.docket.parents
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
642 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
643 self._rustmap, parents = rustmod.DirstateMap.new_v1(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
644 self._use_dirstate_tree, self._readdirstatefile()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
645 )
47136
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
646
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
647 if parents and not self._dirtyparents:
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
648 self.setparents(*parents)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
649
43280
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
650 self.__contains__ = self._rustmap.__contains__
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
651 self.__getitem__ = self._rustmap.__getitem__
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
652 self.get = self._rustmap.get
47136
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47135
diff changeset
653 return self._rustmap
43280
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
654
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
655 def write(self, tr, st, now):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
656 if self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
657 packed = self._rustmap.write_v2(now)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
658 old_docket = self.docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
659 new_docket = docketmod.DirstateDocket.with_new_uuid(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
660 self.parents(), len(packed)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
661 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
662 self._opener.write(new_docket.data_filename(), packed)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
663 # 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
664 # 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
665 # 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
666 st.write(new_docket.serialize())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
667 st.close()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
668 # 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
669 # the new data file was written.
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
670 if old_docket.uuid:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
671 self._opener.unlink(old_docket.data_filename())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
672 self._docket = new_docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
673 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
674 p1, p2 = self.parents()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
675 packed = self._rustmap.write_v1(p1, p2, now)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
676 st.write(packed)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
677 st.close()
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
678 self._dirtyparents = False
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
679
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
680 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
681 def filefoldmap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
682 """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: 42763
diff changeset
683 non-normalized versions.
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
684 """
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
685 return self._rustmap.filefoldmapasdict()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
686
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
687 def hastrackeddir(self, d):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
688 return self._rustmap.hastrackeddir(d)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
689
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
690 def hasdir(self, d):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
691 return self._rustmap.hasdir(d)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
692
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
693 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
694 def identity(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
695 self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
696 return self.identity
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
697
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
698 @property
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
699 def nonnormalset(self):
44181
71e13cfd6154 rust-dirstatemap: add `NonNormalEntries` class
Raphaël Gomès <rgomes@octobus.net>
parents: 44156
diff changeset
700 nonnorm = self._rustmap.non_normal_entries()
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
701 return nonnorm
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
702
44156
7f5410dfc8a6 rust-dirstatemap: add missing @propertycache
Raphaël Gomès <rgomes@octobus.net>
parents: 44078
diff changeset
703 @propertycache
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
704 def otherparentset(self):
44181
71e13cfd6154 rust-dirstatemap: add `NonNormalEntries` class
Raphaël Gomès <rgomes@octobus.net>
parents: 44156
diff changeset
705 otherparents = self._rustmap.other_parent_entries()
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
706 return otherparents
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
707
47108
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47055
diff changeset
708 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: 47055
diff changeset
709 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: 47055
diff changeset
710
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
711 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
712 def dirfoldmap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
713 f = {}
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
714 normcase = util.normcase
47482
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47357
diff changeset
715 for name, _pseudo_entry in self.directories():
42771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
716 f[normcase(name)] = name
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42763
diff changeset
717 return f