annotate mercurial/dirstatemap.py @ 49171:2c0570a6d5ae

followlines: don't put Unicode directly into the .js file (issue6559) Apparently some web server setups may serve this file in a different encoding than UTF-8, and that results in visual garbage in the followlines button that renders for every line in a file. So instead of using this Unicode character in UTF-8 we can encode it as \u2212. Or, to be more explicit, we can use − HTML entity, which resolves into exactly that character. Since now we're using innerHTML property to set the minus part of the button, let's use it to set the plus part as well (even though the plus sign was plain ASCII). A wise man once said "A foolish consistency is the hobgob... eh, whatever." Throw a brick at me if this makes things worse. Differential Revision: https://phab.mercurial-scm.org/D12597
author Anton Shestakov <av6@dwimlabs.net>
date Mon, 02 May 2022 12:10:28 +0400
parents 3df46f3a3d6c
children 2e726c934fcd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47501
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47489
diff changeset
1 # dirstatemap.py
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
2 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
3 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9678
diff changeset
4 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
6
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
7 import errno
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
8
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
9 from .i18n import _
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
10
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
11 from . import (
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
12 error,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
13 pathutil,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
14 policy,
31050
206532700213 txnutil: factor out the logic to read file in according to HG_PENDING
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
15 txnutil,
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
16 util,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
17 )
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
18
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
19 from .dirstateutils import (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
20 docket as docketmod,
48221
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48220
diff changeset
21 v2,
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
22 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
23
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
24 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
25 rustmod = policy.importrust('dirstate')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
26
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
27 propertycache = util.propertycache
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
28
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
29 if rustmod is None:
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
30 DirstateItem = parsers.DirstateItem
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
31 else:
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
32 DirstateItem = rustmod.DirstateItem
21808
7537e57f5dbd dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents: 21116
diff changeset
33
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
34 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
35
47482
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
36
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
37 class _dirstatemapcommon:
48119
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
38 """
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
39 Methods that are identical for both implementations of the dirstatemap
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
40 class, with and without Rust extensions enabled.
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
41 """
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
42
48122
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
43 # please pytype
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
44
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
45 _map = None
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
46 copymap = None
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
47
48120
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
48 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
49 self._use_dirstate_v2 = use_dirstate_v2
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
50 self._nodeconstants = nodeconstants
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
51 self._ui = ui
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
52 self._opener = opener
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
53 self._root = root
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
54 self._filename = b'dirstate'
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
55 self._nodelen = 20 # Also update Rust code when changing this!
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
56 self._parents = None
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
57 self._dirtyparents = False
48220
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
58 self._docket = None
48120
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
59
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
60 # for consistent view between _pl() and _read() invocations
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
61 self._pendingmode = None
fe6617715464 dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48119
diff changeset
62
48122
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
63 def preload(self):
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
64 """Loads the underlying data, if it's not already loaded"""
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
65 self._map
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
66
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
67 def get(self, key, default=None):
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
68 return self._map.get(key, default)
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
69
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
70 def __len__(self):
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
71 return len(self._map)
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
72
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
73 def __iter__(self):
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
74 return iter(self._map)
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
75
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
76 def __contains__(self, key):
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
77 return key in self._map
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
78
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
79 def __getitem__(self, item):
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
80 return self._map[item]
bbd924a36a6e dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
81
48220
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
82 ### disk interaction
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
83
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
84 def _opendirstatefile(self):
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
85 fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
86 if self._pendingmode is not None and self._pendingmode != mode:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
87 fp.close()
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
88 raise error.Abort(
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
89 _(b'working directory state may be changed parallelly')
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
90 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
91 self._pendingmode = mode
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
92 return fp
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
93
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
94 def _readdirstatefile(self, size=-1):
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
95 try:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
96 with self._opendirstatefile() as fp:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
97 return fp.read(size)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
98 except IOError as err:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
99 if err.errno != errno.ENOENT:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
100 raise
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
101 # File doesn't exist, so the current state is empty
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
102 return b''
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
103
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
104 @property
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
105 def docket(self):
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
106 if not self._docket:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
107 if not self._use_dirstate_v2:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
108 raise error.ProgrammingError(
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
109 b'dirstate only has a docket in v2 format'
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
110 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
111 self._docket = docketmod.DirstateDocket.parse(
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
112 self._readdirstatefile(), self._nodeconstants
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
113 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
114 return self._docket
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
115
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
116 def write_v2_no_append(self, tr, st, meta, packed):
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
117 old_docket = self.docket
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
118 new_docket = docketmod.DirstateDocket.with_new_uuid(
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
119 self.parents(), len(packed), meta
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
120 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
121 data_filename = new_docket.data_filename()
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
122 if tr:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
123 tr.add(data_filename, 0)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
124 self._opener.write(data_filename, packed)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
125 # Write the new docket after the new data file has been
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
126 # written. Because `st` was opened with `atomictemp=True`,
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
127 # the actual `.hg/dirstate` file is only affected on close.
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
128 st.write(new_docket.serialize())
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
129 st.close()
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
130 # Remove the old data file after the new docket pointing to
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
131 # the new data file was written.
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
132 if old_docket.uuid:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
133 data_filename = old_docket.data_filename()
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
134 unlink = lambda _tr=None: self._opener.unlink(data_filename)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
135 if tr:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
136 category = b"dirstate-v2-clean-" + old_docket.uuid
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
137 tr.addpostclose(category, unlink)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
138 else:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
139 unlink()
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
140 self._docket = new_docket
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
141
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
142 ### reading/setting parents
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
143
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
144 def parents(self):
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
145 if not self._parents:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
146 if self._use_dirstate_v2:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
147 self._parents = self.docket.parents
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
148 else:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
149 read_len = self._nodelen * 2
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
150 st = self._readdirstatefile(read_len)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
151 l = len(st)
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
152 if l == read_len:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
153 self._parents = (
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
154 st[: self._nodelen],
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
155 st[self._nodelen : 2 * self._nodelen],
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
156 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
157 elif l == 0:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
158 self._parents = (
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
159 self._nodeconstants.nullid,
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
160 self._nodeconstants.nullid,
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
161 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
162 else:
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
163 raise error.Abort(
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
164 _(b'working directory state appears damaged!')
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
165 )
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
166
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
167 return self._parents
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
168
48119
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
169
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
170 class dirstatemap(_dirstatemapcommon):
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
171 """Map encapsulating the dirstate's contents.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
172
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
173 The dirstate contains the following state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
174
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
175 - `identity` is the identity of the dirstate file, which can be used to
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
176 detect when changes have occurred to the dirstate file.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
177
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
178 - `parents` is a pair containing the parents of the working copy. The
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
179 parents are updated by calling `setparents`.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
180
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
181 - the state map maps filenames to tuples of (state, mode, size, mtime),
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
182 where state is a single character representing 'normal', 'added',
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
183 'removed', or 'merged'. It is read by treating the dirstate as a
47996
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
184 dict. File state is updated by calling various methods (see each
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
185 documentation for details):
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
186
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
187 - `reset_state`,
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
188 - `set_tracked`
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
189 - `set_untracked`
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
190 - `set_clean`
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
191 - `set_possibly_dirty`
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
192
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
193 - `copymap` maps destination filenames to their source filename.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
194
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
195 The dirstate also provides the following views onto the state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
196
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
197 - `filefoldmap` is a dict mapping normalized filenames to the denormalized
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
198 form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
199
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
200 - `dirfoldmap` is a dict mapping normalized directory names to the
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
201 denormalized form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
202 """
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
203
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
204 ### Core data storage and access
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
205
34934
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
206 @propertycache
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
207 def _map(self):
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
208 self._map = {}
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
209 self.read()
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
210 return self._map
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
211
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
212 @propertycache
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
213 def copymap(self):
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
214 self.copymap = {}
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
215 self._map
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
216 return self.copymap
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
217
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
218 def clear(self):
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
219 self._map.clear()
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
220 self.copymap.clear()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
221 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
222 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
223 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 util.clearcachedproperty(self, b"filefoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
225 util.clearcachedproperty(self, b"dirfoldmap")
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
226
35878
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
227 def items(self):
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
228 return self._map.items()
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
229
35878
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
230 # forward for python2,3 compat
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
231 iteritems = items
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
232
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
233 def debug_iter(self, all):
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
234 """
48024
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
235 Return an iterator of (filename, state, mode, size, mtime) tuples
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
236
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
237 `all` is unused when Rust is not enabled
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
238 """
48024
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
239 for (filename, item) in self.items():
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
240 yield (filename, item.state, item.mode, item.size, item.mtime)
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
241
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
242 def keys(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
243 return self._map.keys()
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
244
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
245 ### reading/setting parents
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
246
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
247 def setparents(self, p1, p2, fold_p2=False):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
248 self._parents = (p1, p2)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
249 self._dirtyparents = True
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
250 copies = {}
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
251 if fold_p2:
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
252 for f, s in self._map.items():
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
253 # Discard "merged" markers when moving away from a merge state
48148
e2753a7acfa7 dirstate-item: use the `p2_info` property to replace more verbose call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48140
diff changeset
254 if s.p2_info:
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
255 source = self.copymap.pop(f, None)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
256 if source:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
257 copies[f] = source
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
258 s.drop_merge_data()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
259 return copies
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
260
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
261 ### disk interaction
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
262
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
263 def read(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
264 # ignore HG_PENDING because identity is used only for writing
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
265 self.identity = util.filestat.frompath(
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
266 self._opener.join(self._filename)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
267 )
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
268
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
269 if self._use_dirstate_v2:
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
270 if not self.docket.uuid:
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
271 return
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
272 st = self._opener.read(self.docket.data_filename())
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
273 else:
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
274 st = self._readdirstatefile()
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
275
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
276 if not st:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
277 return
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
278
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
279 # TODO: adjust this estimate for dirstate-v2
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
280 if util.safehasattr(parsers, b'dict_new_presized'):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
281 # Make an estimate of the number of files in the dirstate based on
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
282 # its size. This trades wasting some memory for avoiding costly
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
283 # resizes. Each entry have a prefix of 17 bytes followed by one or
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
284 # two path names. Studies on various large-scale real-world repositories
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
285 # found 54 bytes a reasonable upper limit for the average path names.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
286 # Copy entries are ignored for the sake of this estimate.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
287 self._map = parsers.dict_new_presized(len(st) // 71)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
288
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
289 # Python's garbage collector triggers a GC each time a certain number
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
290 # of container objects (the number being defined by
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
291 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
292 # for each file in the dirstate. The C version then immediately marks
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
293 # them as not to be tracked by the collector. However, this has no
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
294 # effect on when GCs are triggered, only on what objects the GC looks
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
295 # into. This means that O(number of files) GCs are unavoidable.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
296 # Depending on when in the process's lifetime the dirstate is parsed,
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
297 # this can get very expensive. As a workaround, disable GC while
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
298 # parsing the dirstate.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
299 #
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
300 # (we cannot decorate the function directly since it is in a C module)
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
301 if self._use_dirstate_v2:
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
302 p = self.docket.parents
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
303 meta = self.docket.tree_metadata
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
304 parse_dirstate = util.nogc(v2.parse_dirstate)
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
305 parse_dirstate(self._map, self.copymap, st, meta)
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
306 else:
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
307 parse_dirstate = util.nogc(parsers.parse_dirstate)
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
308 p = parse_dirstate(self._map, self.copymap, st)
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
309 if not self._dirtyparents:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
310 self.setparents(*p)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
311
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
312 # Avoid excess attribute lookups by fast pathing certain checks
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
313 self.__contains__ = self._map.__contains__
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
314 self.__getitem__ = self._map.__getitem__
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
315 self.get = self._map.get
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
316
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
317 def write(self, tr, st):
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
318 if self._use_dirstate_v2:
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
319 packed, meta = v2.pack_dirstate(self._map, self.copymap)
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
320 self.write_v2_no_append(tr, st, meta, packed)
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
321 else:
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
322 packed = parsers.pack_dirstate(
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
323 self._map, self.copymap, self.parents()
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
324 )
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
325 st.write(packed)
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48221
diff changeset
326 st.close()
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
327 self._dirtyparents = False
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
328
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
329 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
330 def identity(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
331 self._map
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
332 return self.identity
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
333
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
334 ### code related to maintaining and accessing "extra" property
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
335 # (e.g. "has_dir")
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
336
47687
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
337 def _dirs_incr(self, filename, old_entry=None):
49118
2c78dd3f11de dirstatemap: move `_dirs_incr` and `_dirs_decr` methods out of the common
Raphaël Gomès <rgomes@octobus.net>
parents: 49117
diff changeset
338 """increment the dirstate counter if applicable"""
47687
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
339 if (
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
340 old_entry is None or old_entry.removed
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
341 ) and "_dirs" in self.__dict__:
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
342 self._dirs.addpath(filename)
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
343 if old_entry is None and "_alldirs" in self.__dict__:
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
344 self._alldirs.addpath(filename)
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
345
47689
f2aef39abc14 dirstate-map: factor out the change to _dirs and _alldirs on removing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47688
diff changeset
346 def _dirs_decr(self, filename, old_entry=None, remove_variant=False):
49118
2c78dd3f11de dirstatemap: move `_dirs_incr` and `_dirs_decr` methods out of the common
Raphaël Gomès <rgomes@octobus.net>
parents: 49117
diff changeset
347 """decrement the dirstate counter if applicable"""
47688
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
348 if old_entry is not None:
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
349 if "_dirs" in self.__dict__ and not old_entry.removed:
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
350 self._dirs.delpath(filename)
47689
f2aef39abc14 dirstate-map: factor out the change to _dirs and _alldirs on removing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47688
diff changeset
351 if "_alldirs" in self.__dict__ and not remove_variant:
47688
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
352 self._alldirs.delpath(filename)
47689
f2aef39abc14 dirstate-map: factor out the change to _dirs and _alldirs on removing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47688
diff changeset
353 elif remove_variant and "_alldirs" in self.__dict__:
f2aef39abc14 dirstate-map: factor out the change to _dirs and _alldirs on removing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47688
diff changeset
354 self._alldirs.addpath(filename)
47688
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
355 if "filefoldmap" in self.__dict__:
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
356 normed = util.normcase(filename)
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
357 self.filefoldmap.pop(normed, None)
b37ab6b5c438 dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47687
diff changeset
358
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
359 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
360 def filefoldmap(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
361 """Returns a dictionary mapping normalized case paths to their
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
362 non-normalized versions.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
363 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
364 try:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
365 makefilefoldmap = parsers.make_file_foldmap
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
366 except AttributeError:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
367 pass
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
368 else:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
369 return makefilefoldmap(
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
370 self._map, util.normcasespec, util.normcasefallback
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
371 )
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
372
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
373 f = {}
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
374 normcase = util.normcase
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
375 for name, s in self._map.items():
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
376 if not s.removed:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
377 f[normcase(name)] = name
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
378 f[b'.'] = b'.' # prevents useless util.fspath() invocation
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
379 return f
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
380
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
381 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
382 def dirfoldmap(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
383 f = {}
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
384 normcase = util.normcase
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
385 for name in self._dirs:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
386 f[normcase(name)] = name
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
387 return f
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
388
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
389 def hastrackeddir(self, d):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
390 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
391 Returns True if the dirstate contains a tracked (not removed) file
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
392 in this directory.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
393 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
394 return d in self._dirs
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
395
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
396 def hasdir(self, d):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
397 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
398 Returns True if the dirstate contains a file (tracked or removed)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
399 in this directory.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
400 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
401 return d in self._alldirs
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
402
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
403 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
404 def _dirs(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
405 return pathutil.dirs(self._map, only_tracked=True)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
406
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
407 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
408 def _alldirs(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
409 return pathutil.dirs(self._map)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
410
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
411 ### code related to manipulation of entries and copy-sources
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
412
49102
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
413 def reset_state(
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
414 self,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
415 filename,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
416 wc_tracked=False,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
417 p1_tracked=False,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
418 p2_info=False,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
419 has_meaningful_mtime=True,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
420 parentfiledata=None,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
421 ):
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
422 """Set a entry to a given state, diregarding all previous state
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
423
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
424 This is to be used by the part of the dirstate API dedicated to
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
425 adjusting the dirstate after a update/merge.
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
426
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
427 note: calling this might result to no entry existing at all if the
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
428 dirstate map does not see any point at having one for this file
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
429 anymore.
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
430 """
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
431 # copy information are now outdated
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
432 # (maybe new information should be in directly passed to this function)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
433 self.copymap.pop(filename, None)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
434
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
435 if not (p1_tracked or p2_info or wc_tracked):
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
436 old_entry = self._map.get(filename)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
437 self._drop_entry(filename)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
438 self._dirs_decr(filename, old_entry=old_entry)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
439 return
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
440
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
441 old_entry = self._map.get(filename)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
442 self._dirs_incr(filename, old_entry)
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
443 entry = DirstateItem(
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
444 wc_tracked=wc_tracked,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
445 p1_tracked=p1_tracked,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
446 p2_info=p2_info,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
447 has_meaningful_mtime=has_meaningful_mtime,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
448 parentfiledata=parentfiledata,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
449 )
49103
77dfde417e5e dirstatemap: remove `_insert_entry`
Raphaël Gomès <rgomes@octobus.net>
parents: 49102
diff changeset
450 self._map[filename] = entry
49102
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
451
49098
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
452 def set_tracked(self, filename):
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
453 new = False
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
454 entry = self.get(filename)
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
455 if entry is None:
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
456 self._dirs_incr(filename)
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
457 entry = DirstateItem(
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
458 wc_tracked=True,
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
459 )
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
460
49103
77dfde417e5e dirstatemap: remove `_insert_entry`
Raphaël Gomès <rgomes@octobus.net>
parents: 49102
diff changeset
461 self._map[filename] = entry
49098
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
462 new = True
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
463 elif not entry.tracked:
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
464 self._dirs_incr(filename, entry)
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
465 entry.set_tracked()
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
466 self._refresh_entry(filename, entry)
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
467 new = True
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
468 else:
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
469 # XXX This is probably overkill for more case, but we need this to
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
470 # fully replace the `normallookup` call with `set_tracked` one.
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
471 # Consider smoothing this in the future.
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
472 entry.set_possibly_dirty()
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
473 self._refresh_entry(filename, entry)
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
474 return new
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
475
49109
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
476 def set_untracked(self, f):
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
477 """Mark a file as no longer tracked in the dirstate map"""
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
478 entry = self.get(f)
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
479 if entry is None:
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
480 return False
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
481 else:
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
482 self._dirs_decr(f, old_entry=entry, remove_variant=not entry.added)
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
483 if not entry.p2_info:
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
484 self.copymap.pop(f, None)
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
485 entry.set_untracked()
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
486 self._refresh_entry(f, entry)
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
487 return True
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
488
49105
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
489 def set_clean(self, filename, mode, size, mtime):
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
490 """mark a file as back to a clean state"""
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
491 entry = self[filename]
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
492 size = size & rangemask
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
493 entry.set_clean(mode, size, mtime)
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
494 self._refresh_entry(filename, entry)
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
495 self.copymap.pop(filename, None)
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
496
49107
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
497 def set_possibly_dirty(self, filename):
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
498 """record that the current state of the file on disk is unknown"""
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
499 entry = self[filename]
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
500 entry.set_possibly_dirty()
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
501 self._refresh_entry(filename, entry)
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
502
48126
a1a6569b9283 dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48125
diff changeset
503 def _refresh_entry(self, f, entry):
49117
4c562108384f dirstatemap: move `_refresh_entry` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49116
diff changeset
504 """record updated state of an entry"""
48126
a1a6569b9283 dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48125
diff changeset
505 if not entry.any_tracked:
a1a6569b9283 dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48125
diff changeset
506 self._map.pop(f, None)
a1a6569b9283 dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48125
diff changeset
507
48132
c057d7c97b72 dirstatemap: add a common `_drop_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48131
diff changeset
508 def _drop_entry(self, f):
49116
cebb263c865c dirstatemap: move `_drop_entry` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49115
diff changeset
509 """remove any entry for file f
cebb263c865c dirstatemap: move `_drop_entry` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49115
diff changeset
510
cebb263c865c dirstatemap: move `_drop_entry` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49115
diff changeset
511 This should also drop associated copy information
cebb263c865c dirstatemap: move `_drop_entry` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49115
diff changeset
512
cebb263c865c dirstatemap: move `_drop_entry` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49115
diff changeset
513 The fact we actually need to drop it is the responsability of the caller"""
48132
c057d7c97b72 dirstatemap: add a common `_drop_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48131
diff changeset
514 self._map.pop(f, None)
48133
55293938b843 dirstatemap: use a common implement for reset_state
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48132
diff changeset
515 self.copymap.pop(f, None)
48132
c057d7c97b72 dirstatemap: add a common `_drop_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48131
diff changeset
516
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
517
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
518 if rustmod is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
519
48119
aec5b0981c26 dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
520 class dirstatemap(_dirstatemapcommon):
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
521
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
522 ### Core data storage and access
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
523
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
524 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
525 def _map(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
526 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
527 Fills the Dirstatemap when called.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
528 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
529 # ignore HG_PENDING because identity is used only for writing
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
530 self.identity = util.filestat.frompath(
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
531 self._opener.join(self._filename)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
532 )
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
533
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
534 if self._use_dirstate_v2:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
535 if self.docket.uuid:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
536 # TODO: use mmap when possible
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
537 data = self._opener.read(self.docket.data_filename())
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
538 else:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
539 data = b''
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
540 self._map = rustmod.DirstateMap.new_v2(
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
541 data, self.docket.data_size, self.docket.tree_metadata
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
542 )
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
543 parents = self.docket.parents
48051
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
544 else:
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
545 self._map, parents = rustmod.DirstateMap.new_v1(
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
546 self._readdirstatefile()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
547 )
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
548
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
549 if parents and not self._dirtyparents:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
550 self.setparents(*parents)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
551
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
552 self.__contains__ = self._map.__contains__
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
553 self.__getitem__ = self._map.__getitem__
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
554 self.get = self._map.get
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
555 return self._map
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
556
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
557 @property
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
558 def copymap(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
559 return self._map.copymap()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
560
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
561 def debug_iter(self, all):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
562 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
563 Return an iterator of (filename, state, mode, size, mtime) tuples
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
564
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
565 `all`: also include with `state == b' '` dirstate tree nodes that
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
566 don't have an associated `DirstateItem`.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
567
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
568 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
569 return self._map.debug_iter(all)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
570
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
571 def clear(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
572 self._map.clear()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
573 self.setparents(
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
574 self._nodeconstants.nullid, self._nodeconstants.nullid
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
575 )
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
576 util.clearcachedproperty(self, b"_dirs")
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
577 util.clearcachedproperty(self, b"_alldirs")
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
578 util.clearcachedproperty(self, b"dirfoldmap")
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
579
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
580 def items(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
581 return self._map.items()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
582
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
583 # forward for python2,3 compat
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
584 iteritems = items
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
585
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
586 def keys(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
587 return iter(self._map)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
588
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
589 ### reading/setting parents
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
590
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
591 def setparents(self, p1, p2, fold_p2=False):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
592 self._parents = (p1, p2)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
593 self._dirtyparents = True
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
594 copies = {}
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
595 if fold_p2:
49120
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49118
diff changeset
596 copies = self._map.setparents_fixup()
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
597 return copies
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
598
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
599 ### disk interaction
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
600
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
601 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
602 def identity(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
603 self._map
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
604 return self.identity
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
605
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
606 def write(self, tr, st):
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
607 if not self._use_dirstate_v2:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
608 p1, p2 = self.parents()
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
609 packed = self._map.write_v1(p1, p2)
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
610 st.write(packed)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
611 st.close()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
612 self._dirtyparents = False
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
613 return
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
614
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
615 # We can only append to an existing data file if there is one
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
616 can_append = self.docket.uuid is not None
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
617 packed, meta, append = self._map.write_v2(can_append)
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
618 if append:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
619 docket = self.docket
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
620 data_filename = docket.data_filename()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
621 if tr:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
622 tr.add(data_filename, docket.data_size)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
623 with self._opener(data_filename, b'r+b') as fp:
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
624 fp.seek(docket.data_size)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
625 assert fp.tell() == docket.data_size
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
626 written = fp.write(packed)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
627 if written is not None: # py2 may return None
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
628 assert written == len(packed), (written, len(packed))
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
629 docket.data_size += len(packed)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
630 docket.parents = self.parents()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
631 docket.tree_metadata = meta
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
632 st.write(docket.serialize())
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
633 st.close()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
634 else:
48220
e7b5e8ba7cab dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents: 48151
diff changeset
635 self.write_v2_no_append(tr, st, meta, packed)
48123
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
636 # Reload from the newly-written file
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
637 util.clearcachedproperty(self, b"_map")
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
638 self._dirtyparents = False
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
639
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
640 ### code related to maintaining and accessing "extra" property
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
641 # (e.g. "has_dir")
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
642
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
643 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
644 def filefoldmap(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
645 """Returns a dictionary mapping normalized case paths to their
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
646 non-normalized versions.
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
647 """
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
648 return self._map.filefoldmapasdict()
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
649
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
650 def hastrackeddir(self, d):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
651 return self._map.hastrackeddir(d)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
652
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
653 def hasdir(self, d):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
654 return self._map.hasdir(d)
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
655
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
656 @propertycache
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
657 def dirfoldmap(self):
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
658 f = {}
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
659 normcase = util.normcase
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
660 for name in self._map.tracked_dirs():
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
661 f[normcase(name)] = name
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
662 return f
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
663
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
664 ### code related to manipulation of entries and copy-sources
771c90807a2b dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48122
diff changeset
665
49098
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
666 def set_tracked(self, f):
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
667 return self._map.set_tracked(f)
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Raphaël Gomès <rgomes@octobus.net>
parents: 49040
diff changeset
668
49109
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
669 def set_untracked(self, f):
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
670 return self._map.set_untracked(f)
953b08a2d983 dirstatemap: move `set_untracked` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49107
diff changeset
671
49105
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
672 def set_clean(self, filename, mode, size, mtime):
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
673 self._map.set_clean(filename, mode, size, mtime)
a69ea5a3c5a5 dirstatemap: move `set_clean` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49103
diff changeset
674
49107
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
675 def set_possibly_dirty(self, f):
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
676 self._map.set_possibly_dirty(f)
079aaf996eca dirstatemap: move `set_possibly_dirty` out of the common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49105
diff changeset
677
49102
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
678 def reset_state(
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
679 self,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
680 filename,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
681 wc_tracked=False,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
682 p1_tracked=False,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
683 p2_info=False,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
684 has_meaningful_mtime=True,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
685 parentfiledata=None,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
686 ):
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
687 return self._map.reset_state(
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
688 filename,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
689 wc_tracked,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
690 p1_tracked,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
691 p2_info,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
692 has_meaningful_mtime,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
693 parentfiledata,
358b1a1e3678 dirstatemap: move `reset_state` out of common methods
Raphaël Gomès <rgomes@octobus.net>
parents: 49099
diff changeset
694 )