annotate mercurial/dirstatemap.py @ 48059:5d68c4eedd66

dirstate: move parent state handling in the dirstatemap This involves dirstatemap data mostly. Moving this one level down will remove the needs for the dirstatemap to expose some of its internals. This will help us to simplify more code further. Differential Revision: https://phab.mercurial-scm.org/D11505
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 22 Sep 2021 15:17:12 +0200
parents cd13d3c2ad2e
children a660d8a53267
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47501
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47489
diff changeset
1 # dirstatemap.py
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
2 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
3 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9678
diff changeset
4 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
6 from __future__ import absolute_import
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
7
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
8 import errno
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
9
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
10 from .i18n import _
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
11
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
12 from . import (
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
13 error,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
14 pathutil,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
15 policy,
30304
ba2c04059317 py3: use pycompat.ossep at certain places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30224
diff changeset
16 pycompat,
31050
206532700213 txnutil: factor out the logic to read file in according to HG_PENDING
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
17 txnutil,
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
18 util,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
19 )
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
21 from .dirstateutils import (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
22 docket as docketmod,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
23 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
24
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
25 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
26 rustmod = policy.importrust('dirstate')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
27
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
28 propertycache = util.propertycache
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
29
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
30 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
31 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
32 else:
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
33 DirstateItem = rustmod.DirstateItem
21808
7537e57f5dbd dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents: 21116
diff changeset
34
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
35 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
36
47482
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
37
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
38 class dirstatemap(object):
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
39 """Map encapsulating the dirstate's contents.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
40
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
41 The dirstate contains the following state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
42
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
43 - `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
44 detect when changes have occurred to the dirstate file.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
45
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
46 - `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
47 parents are updated by calling `setparents`.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
48
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
49 - 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
50 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
51 '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
52 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
53 documentation for details):
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
54
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
55 - `reset_state`,
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
56 - `set_tracked`
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
57 - `set_untracked`
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
58 - `set_clean`
aa442fde0ea5 dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47990
diff changeset
59 - `set_possibly_dirty`
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
60
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
61 - `copymap` maps destination filenames to their source filename.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
62
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
63 The dirstate also provides the following views onto the state:
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
64
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
65 - `nonnormalset` is a set of the filenames that have state other
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
66 than 'normal', or are normal but have an mtime of -1 ('normallookup').
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
67
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
68 - `otherparentset` is a set of the filenames that are marked as coming
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
69 from the second parent when the dirstate is currently being merged.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
70
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
71 - `filefoldmap` is a dict mapping normalized filenames to the denormalized
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
72 form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
73
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
74 - `dirfoldmap` is a dict mapping normalized directory names to the
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
75 denormalized form that they appear as in the dirstate.
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
76 """
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
77
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
78 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
79 self._ui = ui
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
80 self._opener = opener
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
81 self._root = root
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
82 self._filename = b'dirstate'
45219
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
83 self._nodelen = 20
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
84 self._nodeconstants = nodeconstants
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
85 assert (
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
86 not use_dirstate_v2
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
87 ), "should have detected unsupported requirement"
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
88
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
89 self._parents = None
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
90 self._dirtyparents = False
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
91
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
92 # for consistent view between _pl() and _read() invocations
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
93 self._pendingmode = None
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
94
34934
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
95 @propertycache
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
96 def _map(self):
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
97 self._map = {}
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
98 self.read()
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
99 return self._map
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
100
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
101 @propertycache
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
102 def copymap(self):
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
103 self.copymap = {}
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
104 self._map
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
105 return self.copymap
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
106
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
107 def clear(self):
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
108 self._map.clear()
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
109 self.copymap.clear()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
110 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
111 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
112 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
113 util.clearcachedproperty(self, b"filefoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
114 util.clearcachedproperty(self, b"dirfoldmap")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
115 util.clearcachedproperty(self, b"nonnormalset")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
116 util.clearcachedproperty(self, b"otherparentset")
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
117
35878
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
118 def items(self):
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
119 return pycompat.iteritems(self._map)
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
120
35878
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
121 # forward for python2,3 compat
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
122 iteritems = items
6e7fae8f1c6c contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents: 35835
diff changeset
123
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
124 def debug_iter(self, all):
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
125 """
48024
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
126 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
127
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
128 `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
129 """
48024
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
130 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
131 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
132
34408
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34339
diff changeset
133 def __len__(self):
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34339
diff changeset
134 return len(self._map)
7d2f71b7bc31 dirstate: implement __len__ on dirstatemap (issue5695)
Simon Whitaker <swhitaker@fb.com>
parents: 34339
diff changeset
135
34332
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
136 def __iter__(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
137 return iter(self._map)
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
138
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
139 def get(self, key, default=None):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
140 return self._map.get(key, default)
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
141
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
142 def __contains__(self, key):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
143 return key in self._map
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
144
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
145 def __getitem__(self, key):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
146 return self._map[key]
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
147
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
148 def keys(self):
b36881c68569 dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents: 34188
diff changeset
149 return self._map.keys()
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
150
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
151 def preload(self):
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
152 """Loads the underlying data, if it's not already loaded"""
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
153 self._map
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
154
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
155 def _dirs_incr(self, filename, old_entry=None):
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
156 """incremente the dirstate counter if applicable"""
e59bd6723f2f dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
157 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
158 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
159 ) 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
160 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
161 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
162 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
163
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
164 def _dirs_decr(self, filename, old_entry=None, remove_variant=False):
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
165 """decremente the dirstate counter if applicable"""
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
166 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
167 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
168 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
169 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
170 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
171 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
172 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
173 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
174 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
175 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
176
47720
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
177 def set_possibly_dirty(self, filename):
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
178 """record that the current state of the file on disk is unknown"""
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
179 self[filename].set_possibly_dirty()
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
180
47974
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
181 def set_clean(self, filename, mode, size, mtime):
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
182 """mark a file as back to a clean state"""
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
183 entry = self[filename]
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
184 mtime = mtime & rangemask
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
185 size = size & rangemask
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
186 entry.set_clean(mode, size, mtime)
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
187 self.copymap.pop(filename, None)
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
188 self.nonnormalset.discard(filename)
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
189
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
190 def reset_state(
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
191 self,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
192 filename,
47998
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
193 wc_tracked=False,
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
194 p1_tracked=False,
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
195 p2_tracked=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
196 merged=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
197 clean_p1=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
198 clean_p2=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
199 possibly_dirty=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
200 parentfiledata=None,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
201 ):
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
202 """Set a entry to a given state, diregarding all previous state
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
203
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
204 This is to be used by the part of the dirstate API dedicated to
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
205 adjusting the dirstate after a update/merge.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
206
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
207 note: calling this might result to no entry existing at all if the
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
208 dirstate map does not see any point at having one for this file
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
209 anymore.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
210 """
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
211 if merged and (clean_p1 or clean_p2):
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
212 msg = b'`merged` argument incompatible with `clean_p1`/`clean_p2`'
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
213 raise error.ProgrammingError(msg)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
214 # copy information are now outdated
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
215 # (maybe new information should be in directly passed to this function)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
216 self.copymap.pop(filename, None)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
217
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
218 if not (p1_tracked or p2_tracked or wc_tracked):
47998
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
219 old_entry = self._map.pop(filename, None)
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
220 self._dirs_decr(filename, old_entry=old_entry)
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
221 self.nonnormalset.discard(filename)
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
222 self.copymap.pop(filename, None)
47896
d5b54917eb92 dirstatemap: temporarily return early in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47894
diff changeset
223 return
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
224 elif merged:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
225 # XXX might be merged and removed ?
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
226 entry = self.get(filename)
47904
822c67420c77 dirstatemap: use the default code to handle "merged" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47903
diff changeset
227 if entry is None or not entry.tracked:
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
228 # XXX mostly replicate dirstate.other parent. We should get
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
229 # the higher layer to pass us more reliable data where `merged`
47904
822c67420c77 dirstatemap: use the default code to handle "merged" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47903
diff changeset
230 # actually mean merged. Dropping this clause will show failure
822c67420c77 dirstatemap: use the default code to handle "merged" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47903
diff changeset
231 # in `test-graft.t`
822c67420c77 dirstatemap: use the default code to handle "merged" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47903
diff changeset
232 merged = False
822c67420c77 dirstatemap: use the default code to handle "merged" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47903
diff changeset
233 clean_p2 = True
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
234 elif not (p1_tracked or p2_tracked) and wc_tracked:
47903
6816ae362ddd dirstatemap: use the default code to handle "added" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47902
diff changeset
235 pass # file is added, nothing special to adjust
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
236 elif (p1_tracked or p2_tracked) and not wc_tracked:
47902
4cade5e944c2 dirstatemap: use the default code to handle "removed" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47901
diff changeset
237 pass
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
238 elif clean_p2 and wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
239 if p1_tracked or self.get(filename) is not None:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
240 # XXX the `self.get` call is catching some case in
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
241 # `test-merge-remove.t` where the file is tracked in p1, the
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
242 # p1_tracked argument is False.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
243 #
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
244 # In addition, this seems to be a case where the file is marked
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
245 # as merged without actually being the result of a merge
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
246 # action. So thing are not ideal here.
47901
3429f48d486d dirstatemap: use the default code to handle "clean-p2" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47900
diff changeset
247 merged = True
3429f48d486d dirstatemap: use the default code to handle "clean-p2" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47900
diff changeset
248 clean_p2 = False
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
249 elif not p1_tracked and p2_tracked and wc_tracked:
47900
40cf4b278f8f dirstatemap: use the default code to handle "p2-tracked" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47899
diff changeset
250 clean_p2 = True
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
251 elif possibly_dirty:
47899
625b6ddb828c dirstatemap: use the default code to handle "possibly_dirty" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47898
diff changeset
252 pass
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
253 elif wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
254 # this is a "normal" file
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
255 if parentfiledata is None:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
256 msg = b'failed to pass parentfiledata for a normal file: %s'
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
257 msg %= filename
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
258 raise error.ProgrammingError(msg)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
259 else:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
260 assert False, 'unreachable'
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
261
47897
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
262 old_entry = self._map.get(filename)
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
263 self._dirs_incr(filename, old_entry)
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
264 entry = DirstateItem(
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
265 wc_tracked=wc_tracked,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
266 p1_tracked=p1_tracked,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
267 p2_tracked=p2_tracked,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
268 merged=merged,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
269 clean_p1=clean_p1,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
270 clean_p2=clean_p2,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
271 possibly_dirty=possibly_dirty,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
272 parentfiledata=parentfiledata,
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
273 )
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
274 if entry.dm_nonnormal:
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
275 self.nonnormalset.add(filename)
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
276 else:
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
277 self.nonnormalset.discard(filename)
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
278 if entry.dm_otherparent:
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
279 self.otherparentset.add(filename)
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
280 else:
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
281 self.otherparentset.discard(filename)
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
282 self._map[filename] = entry
4f0ebf83e4dc dirstatemap: conclude `reset_state` with logic using the new __init__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47896
diff changeset
283
47990
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
284 def set_tracked(self, filename):
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
285 new = False
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
286 entry = self.get(filename)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
287 if entry is None:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
288 self._dirs_incr(filename)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
289 entry = DirstateItem(
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
290 p1_tracked=False,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
291 p2_tracked=False,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
292 wc_tracked=True,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
293 merged=False,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
294 clean_p1=False,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
295 clean_p2=False,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
296 possibly_dirty=False,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
297 parentfiledata=None,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
298 )
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
299 self._map[filename] = entry
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
300 if entry.dm_nonnormal:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
301 self.nonnormalset.add(filename)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
302 new = True
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
303 elif not entry.tracked:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
304 self._dirs_incr(filename, entry)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
305 entry.set_tracked()
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
306 new = True
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
307 else:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
308 # XXX This is probably overkill for more case, but we need this to
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
309 # fully replace the `normallookup` call with `set_tracked` one.
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
310 # Consider smoothing this in the future.
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
311 self.set_possibly_dirty(filename)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
312 return new
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
313
47890
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
314 def set_untracked(self, f):
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
315 """Mark a file as no longer tracked in the dirstate map"""
47972
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
316 entry = self.get(f)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
317 if entry is None:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
318 return False
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
319 else:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
320 self._dirs_decr(f, old_entry=entry, remove_variant=not entry.added)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
321 if not entry.merged:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
322 self.copymap.pop(f, None)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
323 if entry.added:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
324 self.nonnormalset.discard(f)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
325 self._map.pop(f, None)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
326 else:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
327 self.nonnormalset.add(f)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
328 if entry.from_p2:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
329 self.otherparentset.add(f)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
330 entry.set_untracked()
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
331 return True
35079
853b7c41d19c dirstate: add explicit methods for modifying dirstate
Mark Thomas <mbthomas@fb.com>
parents: 35078
diff changeset
332
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
333 def nonnormalentries(self):
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
334 '''Compute the nonnormal dirstate entries from the dmap'''
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
335 try:
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
336 return parsers.nonnormalotherparententries(self._map)
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
337 except AttributeError:
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
338 nonnorm = set()
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
339 otherparent = set()
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
340 for fname, e in pycompat.iteritems(self._map):
47685
265cdfaad372 dirstate-item: introduce a `dm_nonnormal` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
341 if e.dm_nonnormal:
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
342 nonnorm.add(fname)
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
343 if e.from_p2:
34333
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
344 otherparent.add(fname)
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
345 return nonnorm, otherparent
4ac04418ce66 dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents: 34332
diff changeset
346
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
347 @propertycache
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
348 def filefoldmap(self):
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
349 """Returns a dictionary mapping normalized case paths to their
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
350 non-normalized versions.
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
351 """
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
352 try:
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
353 makefilefoldmap = parsers.make_file_foldmap
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
354 except AttributeError:
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
355 pass
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
356 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
357 return makefilefoldmap(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
358 self._map, util.normcasespec, util.normcasefallback
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
359 )
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
360
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
361 f = {}
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
362 normcase = util.normcase
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
363 for name, s in pycompat.iteritems(self._map):
47542
b8013cb71ef3 dirstate-item: use the properties in dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
364 if not s.removed:
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
365 f[normcase(name)] = name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
366 f[b'.'] = b'.' # prevents useless util.fspath() invocation
34334
d8b35920b7b1 dirstate: move filefoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34333
diff changeset
367 return f
34335
af9722412ac3 dirstate: move _dirs to dirstatemap
Durham Goode <durham@fb.com>
parents: 34334
diff changeset
368
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
369 def hastrackeddir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
370 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
371 Returns True if the dirstate contains a tracked (not removed) file
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
372 in this directory.
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
373 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
374 return d in self._dirs
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
375
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
376 def hasdir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
377 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
378 Returns True if the dirstate contains a file (tracked or removed)
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
379 in this directory.
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
380 """
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
381 return d in self._alldirs
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
382
34677
014bd2a555c8 dirstate: remove _dirs property cache
Durham Goode <durham@fb.com>
parents: 34676
diff changeset
383 @propertycache
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
384 def _dirs(self):
47944
e02f9af7aed1 pathutil: replace the `skip` argument of `dirs` with a boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47907
diff changeset
385 return pathutil.dirs(self._map, only_tracked=True)
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
386
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
387 @propertycache
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
388 def _alldirs(self):
43523
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
389 return pathutil.dirs(self._map)
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
390
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
391 def _opendirstatefile(self):
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
392 fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
393 if self._pendingmode is not None and self._pendingmode != mode:
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
394 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
395 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
396 _(b'working directory state may be changed parallelly')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
397 )
34337
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
398 self._pendingmode = mode
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
399 return fp
c36c3fa7d35b dirstate: move opendirstatefile to dirstatemap
Durham Goode <durham@fb.com>
parents: 34336
diff changeset
400
34338
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34337
diff changeset
401 def parents(self):
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
402 if not self._parents:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
403 try:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
404 fp = self._opendirstatefile()
45219
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
405 st = fp.read(2 * self._nodelen)
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
406 fp.close()
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
407 except IOError as err:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
408 if err.errno != errno.ENOENT:
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
409 raise
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
410 # File doesn't exist, so the current state is empty
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
411 st = b''
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
412
34338
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34337
diff changeset
413 l = len(st)
45219
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
414 if l == self._nodelen * 2:
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
415 self._parents = (
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
416 st[: self._nodelen],
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
417 st[self._nodelen : 2 * self._nodelen],
4f0e03d980f3 dirstate: isolate node len dependency for the pure version
Joerg Sonnenberger <joerg@bec.de>
parents: 44852
diff changeset
418 )
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
419 elif l == 0:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
420 self._parents = (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
421 self._nodeconstants.nullid,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
422 self._nodeconstants.nullid,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
423 )
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
424 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
425 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
426 _(b'working directory state appears damaged!')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
427 )
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
428
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
429 return self._parents
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
430
48059
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
431 def setparents(self, p1, p2, fold_p2=False):
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
432 self._parents = (p1, p2)
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
433 self._dirtyparents = True
48059
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
434 copies = {}
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
435 if fold_p2:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
436 candidatefiles = self.non_normal_or_other_parent_paths()
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
437
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
438 for f in candidatefiles:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
439 s = self.get(f)
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
440 if s is None:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
441 continue
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
442
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
443 # Discard "merged" markers when moving away from a merge state
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
444 if s.merged:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
445 source = self.copymap.get(f)
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
446 if source:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
447 copies[f] = source
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
448 self.reset_state(
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
449 f,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
450 wc_tracked=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
451 p1_tracked=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
452 possibly_dirty=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
453 )
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
454 # Also fix up otherparent markers
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
455 elif s.from_p2:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
456 source = self.copymap.get(f)
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
457 if source:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
458 copies[f] = source
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
459 self.reset_state(
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
460 f,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
461 p1_tracked=False,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
462 wc_tracked=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
463 )
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
464 return copies
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
465
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
466 def read(self):
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
467 # ignore HG_PENDING because identity is used only for writing
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
468 self.identity = util.filestat.frompath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
469 self._opener.join(self._filename)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
470 )
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
471
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
472 try:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
473 fp = self._opendirstatefile()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
474 try:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
475 st = fp.read()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
476 finally:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
477 fp.close()
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
478 except IOError as err:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
479 if err.errno != errno.ENOENT:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
480 raise
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
481 return
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
482 if not st:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
483 return
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
484
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
485 if util.safehasattr(parsers, b'dict_new_presized'):
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
486 # Make an estimate of the number of files in the dirstate based on
45243
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
487 # its size. This trades wasting some memory for avoiding costly
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
488 # resizes. Each entry have a prefix of 17 bytes followed by one or
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
489 # two path names. Studies on various large-scale real-world repositories
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
490 # found 54 bytes a reasonable upper limit for the average path names.
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
491 # Copy entries are ignored for the sake of this estimate.
ad7006830106 dirstate: restore original estimation and update comment
Joerg Sonnenberger <joerg@bec.de>
parents: 45241
diff changeset
492 self._map = parsers.dict_new_presized(len(st) // 71)
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
493
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
494 # Python's garbage collector triggers a GC each time a certain number
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
495 # of container objects (the number being defined by
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
496 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
497 # for each file in the dirstate. The C version then immediately marks
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
498 # them as not to be tracked by the collector. However, this has no
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
499 # effect on when GCs are triggered, only on what objects the GC looks
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
500 # into. This means that O(number of files) GCs are unavoidable.
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
501 # Depending on when in the process's lifetime the dirstate is parsed,
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
502 # this can get very expensive. As a workaround, disable GC while
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
503 # parsing the dirstate.
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
504 #
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
505 # (we cannot decorate the function directly since it is in a C module)
42747
760a7851e9ba rust-parsers: move parser bindings to their own file and Python module
Raphaël Gomès <rgomes@octobus.net>
parents: 42456
diff changeset
506 parse_dirstate = util.nogc(parsers.parse_dirstate)
34672
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
507 p = parse_dirstate(self._map, self.copymap, st)
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
508 if not self._dirtyparents:
e159f217230e dirstate: move _read into dirstatemap
Durham Goode <durham@fb.com>
parents: 34480
diff changeset
509 self.setparents(*p)
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
510
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
511 # Avoid excess attribute lookups by fast pathing certain checks
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
512 self.__contains__ = self._map.__contains__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
513 self.__getitem__ = self._map.__getitem__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
514 self.get = self._map.get
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
515
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
516 def write(self, _tr, st, now):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
517 st.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
518 parsers.pack_dirstate(self._map, self.copymap, self.parents(), now)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
519 )
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
520 st.close()
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
521 self._dirtyparents = False
34674
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
522 self.nonnormalset, self.otherparentset = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
523
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
524 @propertycache
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
525 def nonnormalset(self):
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
526 nonnorm, otherparents = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
527 self.otherparentset = otherparents
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
528 return nonnorm
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
529
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
530 @propertycache
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
531 def otherparentset(self):
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
532 nonnorm, otherparents = self.nonnormalentries()
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
533 self.nonnormalset = nonnorm
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
534 return otherparents
60927b19ed65 dirstate: move nonnormal and otherparent sets to dirstatemap
Durham Goode <durham@fb.com>
parents: 34673
diff changeset
535
47094
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
536 def non_normal_or_other_parent_paths(self):
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
537 return self.nonnormalset.union(self.otherparentset)
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
538
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
539 @propertycache
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
540 def identity(self):
34934
6e66033f91cc dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents: 34933
diff changeset
541 self._map
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
542 return self.identity
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
543
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
544 @propertycache
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
545 def dirfoldmap(self):
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
546 f = {}
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
547 normcase = util.normcase
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
548 for name in self._dirs:
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
549 f[normcase(name)] = name
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
550 return f
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
551
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
552
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
553 if rustmod is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
554
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
555 class dirstatemap(object):
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
556 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
557 self._use_dirstate_v2 = use_dirstate_v2
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
558 self._nodeconstants = nodeconstants
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
559 self._ui = ui
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
560 self._opener = opener
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
561 self._root = root
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
562 self._filename = b'dirstate'
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
563 self._nodelen = 20 # Also update Rust code when changing this!
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
564 self._parents = None
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
565 self._dirtyparents = False
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
566 self._docket = None
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
567
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
568 # for consistent view between _pl() and _read() invocations
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
569 self._pendingmode = None
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
570
47320
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
571 self._use_dirstate_tree = self._ui.configbool(
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
572 b"experimental",
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
573 b"dirstate-tree.in-memory",
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
574 False,
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
575 )
a43d256c041a dirstate-v2: Add `hg debugupgraderepo` command support
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
576
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
577 def addfile(
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
578 self,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
579 f,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
580 mode=0,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
581 size=None,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
582 mtime=None,
47525
fe4641cf9b72 dirstate: use a `added` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47524
diff changeset
583 added=False,
47527
c6b91a9c242a dirstate: use a `merged` parameter to _addpath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47525
diff changeset
584 merged=False,
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
585 from_p2=False,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
586 possibly_dirty=False,
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
587 ):
48051
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
588 if added:
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
589 assert not possibly_dirty
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
590 assert not from_p2
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
591 item = DirstateItem.new_added()
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
592 elif merged:
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
593 assert not possibly_dirty
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
594 assert not from_p2
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
595 item = DirstateItem.new_merged()
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
596 elif from_p2:
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
597 assert not possibly_dirty
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
598 item = DirstateItem.new_from_p2()
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
599 elif possibly_dirty:
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
600 item = DirstateItem.new_possibly_dirty()
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
601 else:
48052
d07d38ef6362 dirstate: Appease pytype
Simon Sapin <simon.sapin@octobus.net>
parents: 48051
diff changeset
602 assert size is not None
d07d38ef6362 dirstate: Appease pytype
Simon Sapin <simon.sapin@octobus.net>
parents: 48051
diff changeset
603 assert mtime is not None
48051
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
604 size = size & rangemask
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
605 mtime = mtime & rangemask
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
606 item = DirstateItem.new_normal(mode, size, mtime)
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
607 self._rustmap.addfile(f, item)
47983
ffde999a3ea9 dirstate: same logic as what we did for `_drop`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
608 if added:
ffde999a3ea9 dirstate: same logic as what we did for `_drop`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
609 self.copymap.pop(f, None)
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
610
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
611 def reset_state(
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
612 self,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
613 filename,
47998
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
614 wc_tracked=False,
938a7769050c dirstate: support file tracked nowhere in `reset_state`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47997
diff changeset
615 p1_tracked=False,
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
616 p2_tracked=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
617 merged=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
618 clean_p1=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
619 clean_p2=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
620 possibly_dirty=False,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
621 parentfiledata=None,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
622 ):
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
623 """Set a entry to a given state, disregarding all previous state
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
624
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
625 This is to be used by the part of the dirstate API dedicated to
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
626 adjusting the dirstate after a update/merge.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
627
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
628 note: calling this might result to no entry existing at all if the
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
629 dirstate map does not see any point at having one for this file
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
630 anymore.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
631 """
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
632 if merged and (clean_p1 or clean_p2):
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
633 msg = (
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
634 b'`merged` argument incompatible with `clean_p1`/`clean_p2`'
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
635 )
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
636 raise error.ProgrammingError(msg)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
637 # copy information are now outdated
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
638 # (maybe new information should be in directly passed to this function)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
639 self.copymap.pop(filename, None)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
640
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
641 if not (p1_tracked or p2_tracked or wc_tracked):
48050
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
642 self._rustmap.drop_item_and_copy_source(filename)
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
643 elif merged:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
644 # XXX might be merged and removed ?
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
645 entry = self.get(filename)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
646 if entry is not None and entry.tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
647 # XXX mostly replicate dirstate.other parent. We should get
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
648 # the higher layer to pass us more reliable data where `merged`
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
649 # actually mean merged. Dropping the else clause will show
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
650 # failure in `test-graft.t`
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
651 self.addfile(filename, merged=True)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
652 else:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
653 self.addfile(filename, from_p2=True)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
654 elif not (p1_tracked or p2_tracked) and wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
655 self.addfile(
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
656 filename, added=True, possibly_dirty=possibly_dirty
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
657 )
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
658 elif (p1_tracked or p2_tracked) and not wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
659 # XXX might be merged and removed ?
47894
226c7dbeea11 rust-dirstatemap: temporarily use `from_v1_data` in `addfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47893
diff changeset
660 self[filename] = DirstateItem.from_v1_data(b'r', 0, 0, 0)
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
661 self.nonnormalset.add(filename)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
662 elif clean_p2 and wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
663 if p1_tracked or self.get(filename) is not None:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
664 # XXX the `self.get` call is catching some case in
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
665 # `test-merge-remove.t` where the file is tracked in p1, the
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
666 # p1_tracked argument is False.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
667 #
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
668 # In addition, this seems to be a case where the file is marked
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
669 # as merged without actually being the result of a merge
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
670 # action. So thing are not ideal here.
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
671 self.addfile(filename, merged=True)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
672 else:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
673 self.addfile(filename, from_p2=True)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
674 elif not p1_tracked and p2_tracked and wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
675 self.addfile(
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
676 filename, from_p2=True, possibly_dirty=possibly_dirty
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
677 )
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
678 elif possibly_dirty:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
679 self.addfile(filename, possibly_dirty=possibly_dirty)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
680 elif wc_tracked:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
681 # this is a "normal" file
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
682 if parentfiledata is None:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
683 msg = b'failed to pass parentfiledata for a normal file: %s'
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
684 msg %= filename
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
685 raise error.ProgrammingError(msg)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
686 mode, size, mtime = parentfiledata
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
687 self.addfile(filename, mode=mode, size=size, mtime=mtime)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
688 self.nonnormalset.discard(filename)
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
689 else:
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
690 assert False, 'unreachable'
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
691
47990
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
692 def set_tracked(self, filename):
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
693 new = False
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
694 entry = self.get(filename)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
695 if entry is None:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
696 self.addfile(filename, added=True)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
697 new = True
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
698 elif not entry.tracked:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
699 entry.set_tracked()
48045
32ef647821b2 dirstate: Skip no-op conversion in Rust DirstateMap::set_v1
Simon Sapin <simon.sapin@octobus.net>
parents: 48044
diff changeset
700 self._rustmap.set_dirstate_item(filename, entry)
47990
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
701 new = True
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
702 else:
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
703 # XXX This is probably overkill for more case, but we need this to
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
704 # fully replace the `normallookup` call with `set_tracked` one.
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
705 # Consider smoothing this in the future.
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
706 self.set_possibly_dirty(filename)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
707 return new
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
708
47890
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
709 def set_untracked(self, f):
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
710 """Mark a file as no longer tracked in the dirstate map"""
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
711 # in merge is only trigger more logic, so it "fine" to pass it.
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
712 #
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
713 # the inner rust dirstate map code need to be adjusted once the API
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
714 # for dirstate/dirstatemap/DirstateItem is a bit more settled
47972
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
715 entry = self.get(f)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
716 if entry is None:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
717 return False
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
718 else:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
719 if entry.added:
48050
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
720 self._rustmap.drop_item_and_copy_source(f)
47972
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
721 else:
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
722 self._rustmap.removefile(f, in_merge=True)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47970
diff changeset
723 return True
47890
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47770
diff changeset
724
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
725 def removefile(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
726 return self._rustmap.removefile(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
727
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
728 def nonnormalentries(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
729 return self._rustmap.nonnormalentries()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
730
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
731 def get(self, *args, **kwargs):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
732 return self._rustmap.get(*args, **kwargs)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
733
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
734 @property
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
735 def copymap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
736 return self._rustmap.copymap()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
737
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
738 def debug_iter(self, all):
48024
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
739 """
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
740 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
741
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
742 `all`: also include with `state == b' '` dirstate tree nodes that
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
743 don't have an associated `DirstateItem`.
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
744
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
745 """
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
746 return self._rustmap.debug_iter(all)
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
747
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
748 def preload(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
749 self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
750
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
751 def clear(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
752 self._rustmap.clear()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
753 self.setparents(
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
754 self._nodeconstants.nullid, self._nodeconstants.nullid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
755 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
756 util.clearcachedproperty(self, b"_dirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
757 util.clearcachedproperty(self, b"_alldirs")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
758 util.clearcachedproperty(self, b"dirfoldmap")
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
759
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
760 def items(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
761 return self._rustmap.items()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
762
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
763 def keys(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
764 return iter(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
765
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
766 def __contains__(self, key):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
767 return key in self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
768
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
769 def __getitem__(self, item):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
770 return self._rustmap[item]
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
771
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
772 def __len__(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
773 return len(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
774
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
775 def __iter__(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
776 return iter(self._rustmap)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
777
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
778 # forward for python2,3 compat
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
779 iteritems = items
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
780
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
781 def _opendirstatefile(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
782 fp, mode = txnutil.trypending(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
783 self._root, self._opener, self._filename
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
784 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
785 if self._pendingmode is not None and self._pendingmode != mode:
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
786 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
787 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
788 _(b'working directory state may be changed parallelly')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
789 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
790 self._pendingmode = mode
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
791 return fp
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
792
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
793 def _readdirstatefile(self, size=-1):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
794 try:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
795 with self._opendirstatefile() as fp:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
796 return fp.read(size)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
797 except IOError as err:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
798 if err.errno != errno.ENOENT:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
799 raise
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
800 # File doesn't exist, so the current state is empty
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
801 return b''
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
802
48059
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
803 def setparents(self, p1, p2, fold_p2=False):
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
804 self._parents = (p1, p2)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
805 self._dirtyparents = True
48059
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
806 copies = {}
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
807 if fold_p2:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
808 candidatefiles = self.non_normal_or_other_parent_paths()
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
809
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
810 for f in candidatefiles:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
811 s = self.get(f)
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
812 if s is None:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
813 continue
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
814
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
815 # Discard "merged" markers when moving away from a merge state
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
816 if s.merged:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
817 source = self.copymap.get(f)
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
818 if source:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
819 copies[f] = source
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
820 self.reset_state(
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
821 f,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
822 wc_tracked=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
823 p1_tracked=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
824 possibly_dirty=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
825 )
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
826 # Also fix up otherparent markers
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
827 elif s.from_p2:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
828 source = self.copymap.get(f)
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
829 if source:
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
830 copies[f] = source
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
831 self.reset_state(
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
832 f,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
833 p1_tracked=False,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
834 wc_tracked=True,
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
835 )
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
836 return copies
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
837
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
838 def parents(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
839 if not self._parents:
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
840 if self._use_dirstate_v2:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
841 self._parents = self.docket.parents
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
842 else:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
843 read_len = self._nodelen * 2
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
844 st = self._readdirstatefile(read_len)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
845 l = len(st)
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
846 if l == read_len:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
847 self._parents = (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
848 st[: self._nodelen],
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
849 st[self._nodelen : 2 * self._nodelen],
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
850 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
851 elif l == 0:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
852 self._parents = (
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
853 self._nodeconstants.nullid,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
854 self._nodeconstants.nullid,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
855 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
856 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
857 raise error.Abort(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
858 _(b'working directory state appears damaged!')
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
859 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
860
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
861 return self._parents
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
862
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
863 @property
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
864 def docket(self):
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
865 if not self._docket:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
866 if not self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
867 raise error.ProgrammingError(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
868 b'dirstate only has a docket in v2 format'
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
869 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
870 self._docket = docketmod.DirstateDocket.parse(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
871 self._readdirstatefile(), self._nodeconstants
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
872 )
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
873 return self._docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
874
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
875 @propertycache
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
876 def _rustmap(self):
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
877 """
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
878 Fills the Dirstatemap when called.
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
879 """
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
880 # ignore HG_PENDING because identity is used only for writing
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
881 self.identity = util.filestat.frompath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
882 self._opener.join(self._filename)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
883 )
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
884
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
885 if self._use_dirstate_v2:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
886 if self.docket.uuid:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
887 # TODO: use mmap when possible
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
888 data = self._opener.read(self.docket.data_filename())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
889 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
890 data = b''
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
891 self._rustmap = rustmod.DirstateMap.new_v2(
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
892 data, self.docket.data_size, self.docket.tree_metadata
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
893 )
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
894 parents = self.docket.parents
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
895 else:
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
896 self._rustmap, parents = rustmod.DirstateMap.new_v1(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
897 self._use_dirstate_tree, self._readdirstatefile()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
898 )
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
899
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
900 if parents and not self._dirtyparents:
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
901 self.setparents(*parents)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
902
43280
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
903 self.__contains__ = self._rustmap.__contains__
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
904 self.__getitem__ = self._rustmap.__getitem__
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
905 self.get = self._rustmap.get
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
906 return self._rustmap
43280
5d4046594d6f rust-dirstatemap: remove additional lookups in dirstatemap
Raphaël Gomès <rgomes@octobus.net>
parents: 43274
diff changeset
907
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
908 def write(self, tr, st, now):
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
909 if not self._use_dirstate_v2:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
910 p1, p2 = self.parents()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
911 packed = self._rustmap.write_v1(p1, p2, now)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
912 st.write(packed)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
913 st.close()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
914 self._dirtyparents = False
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
915 return
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
916
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
917 # We can only append to an existing data file if there is one
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
918 can_append = self.docket.uuid is not None
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
919 packed, meta, append = self._rustmap.write_v2(now, can_append)
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
920 if append:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
921 docket = self.docket
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
922 data_filename = docket.data_filename()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
923 if tr:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
924 tr.add(data_filename, docket.data_size)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
925 with self._opener(data_filename, b'r+b') as fp:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
926 fp.seek(docket.data_size)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
927 assert fp.tell() == docket.data_size
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
928 written = fp.write(packed)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
929 if written is not None: # py2 may return None
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
930 assert written == len(packed), (written, len(packed))
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
931 docket.data_size += len(packed)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
932 docket.parents = self.parents()
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
933 docket.tree_metadata = meta
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
934 st.write(docket.serialize())
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
935 st.close()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
936 else:
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
937 old_docket = self.docket
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
938 new_docket = docketmod.DirstateDocket.with_new_uuid(
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
939 self.parents(), len(packed), meta
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
940 )
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
941 data_filename = new_docket.data_filename()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
942 if tr:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
943 tr.add(data_filename, 0)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
944 self._opener.write(data_filename, packed)
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
945 # Write the new docket after the new data file has been
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
946 # written. Because `st` was opened with `atomictemp=True`,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
947 # the actual `.hg/dirstate` file is only affected on close.
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
948 st.write(new_docket.serialize())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
949 st.close()
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
950 # Remove the old data file after the new docket pointing to
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
951 # the new data file was written.
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
952 if old_docket.uuid:
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
953 data_filename = old_docket.data_filename()
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
954 unlink = lambda _tr=None: self._opener.unlink(data_filename)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
955 if tr:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
956 category = b"dirstate-v2-clean-" + old_docket.uuid
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
957 tr.addpostclose(category, unlink)
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
958 else:
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
959 unlink()
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47672
diff changeset
960 self._docket = new_docket
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
961 # Reload from the newly-written file
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
962 util.clearcachedproperty(self, b"_rustmap")
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
963 self._dirtyparents = False
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
964
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
965 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
966 def filefoldmap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
967 """Returns a dictionary mapping normalized case paths to their
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
968 non-normalized versions.
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
969 """
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
970 return self._rustmap.filefoldmapasdict()
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
971
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
972 def hastrackeddir(self, d):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
973 return self._rustmap.hastrackeddir(d)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
974
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
975 def hasdir(self, d):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
976 return self._rustmap.hasdir(d)
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
977
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
978 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
979 def identity(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
980 self._rustmap
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
981 return self.identity
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
982
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
983 @property
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
984 def nonnormalset(self):
44297
cf1f8660e568 rust-dirstatemap: add `NonNormalEntries` class
Raphaël Gomès <rgomes@octobus.net>
parents: 44227
diff changeset
985 nonnorm = self._rustmap.non_normal_entries()
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
986 return nonnorm
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
987
44227
7f5410dfc8a6 rust-dirstatemap: add missing @propertycache
Raphaël Gomès <rgomes@octobus.net>
parents: 44078
diff changeset
988 @propertycache
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
989 def otherparentset(self):
44297
cf1f8660e568 rust-dirstatemap: add `NonNormalEntries` class
Raphaël Gomès <rgomes@octobus.net>
parents: 44227
diff changeset
990 otherparents = self._rustmap.other_parent_entries()
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
991 return otherparents
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
992
47094
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
993 def non_normal_or_other_parent_paths(self):
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
994 return self._rustmap.non_normal_or_other_parent_paths()
e061a1df32a8 dirstate-tree: Abstract "non-normal" and "other parent" sets
Simon Sapin <simon.sapin@octobus.net>
parents: 47012
diff changeset
995
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
996 @propertycache
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
997 def dirfoldmap(self):
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
998 f = {}
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
999 normcase = util.normcase
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1000 for name in self._rustmap.tracked_dirs():
42755
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
1001 f[normcase(name)] = name
749ef8c31187 rust-dirstate: call rust dirstatemap from Python
Raphaël Gomès <rgomes@octobus.net>
parents: 42747
diff changeset
1002 return f
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
1003
47720
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
1004 def set_possibly_dirty(self, filename):
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
1005 """record that the current state of the file on disk is unknown"""
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
1006 entry = self[filename]
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
1007 entry.set_possibly_dirty()
48045
32ef647821b2 dirstate: Skip no-op conversion in Rust DirstateMap::set_v1
Simon Sapin <simon.sapin@octobus.net>
parents: 48044
diff changeset
1008 self._rustmap.set_dirstate_item(filename, entry)
47720
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
1009
47974
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1010 def set_clean(self, filename, mode, size, mtime):
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1011 """mark a file as back to a clean state"""
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1012 entry = self[filename]
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1013 mtime = mtime & rangemask
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1014 size = size & rangemask
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1015 entry.set_clean(mode, size, mtime)
48045
32ef647821b2 dirstate: Skip no-op conversion in Rust DirstateMap::set_v1
Simon Sapin <simon.sapin@octobus.net>
parents: 48044
diff changeset
1016 self._rustmap.set_dirstate_item(filename, entry)
47974
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1017 self._rustmap.copymap().pop(filename, None)
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
1018
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
1019 def __setitem__(self, key, value):
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47689
diff changeset
1020 assert isinstance(value, DirstateItem)
48045
32ef647821b2 dirstate: Skip no-op conversion in Rust DirstateMap::set_v1
Simon Sapin <simon.sapin@octobus.net>
parents: 48044
diff changeset
1021 self._rustmap.set_dirstate_item(key, value)