Mercurial > public > mercurial-scm > hg
annotate mercurial/dirstatemap.py @ 52049:af54626bf358
dirstate-map: add a missing debug wait point when accessing the v2 docket
fc8e37c380d3 added synchronization points to the dirstate to allow for race
condition testing without actually requiring a time-based race condition
to happen.
This changes adds the `pre-read-file` wait point before we read the docket,
since callers might ask for the parents before anything else is
read, leading to the first read being done before the wait point.
This removes some differences in test output which were presumed to be
speed related, but weren't.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Mon, 14 Oct 2024 14:14:21 +0200 |
parents | f4733654f144 |
children | ea0467ed76aa |
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 | 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 |
51859
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51712
diff
changeset
|
6 from __future__ import annotations |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
7 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
8 from typing import ( |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
9 Optional, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
10 TYPE_CHECKING, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
11 ) |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
12 |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
13 from .i18n import _ |
43239
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
14 |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
15 from . import ( |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
16 error, |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
17 pathutil, |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32352
diff
changeset
|
18 policy, |
50228
fc8e37c380d3
dirstate: add a synchronisation point before doing a full dirstate read
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50222
diff
changeset
|
19 testing, |
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
|
20 txnutil, |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
21 typelib, |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
22 util, |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
23 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
24 |
47674
ff97e793ed36
dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents:
47672
diff
changeset
|
25 from .dirstateutils import ( |
ff97e793ed36
dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents:
47672
diff
changeset
|
26 docket as docketmod, |
48221
a32a96079e2d
dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents:
48220
diff
changeset
|
27 v2, |
47674
ff97e793ed36
dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents:
47672
diff
changeset
|
28 ) |
ff97e793ed36
dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents:
47672
diff
changeset
|
29 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
30 if TYPE_CHECKING: |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
31 from . import ( |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
32 ui as uimod, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
33 ) |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
34 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43505
diff
changeset
|
35 parsers = policy.importmod('parsers') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43505
diff
changeset
|
36 rustmod = policy.importrust('dirstate') |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32352
diff
changeset
|
37 |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
38 propertycache = util.propertycache |
16201
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
39 |
48044
d5528ac9b4f2
dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48024
diff
changeset
|
40 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
|
41 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
|
42 else: |
d5528ac9b4f2
dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48024
diff
changeset
|
43 DirstateItem = rustmod.DirstateItem |
21808
7537e57f5dbd
dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents:
21116
diff
changeset
|
44 |
47521
abed645b8e96
dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47514
diff
changeset
|
45 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
|
46 |
50221
1891086f6c7f
dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50097
diff
changeset
|
47 WRITE_MODE_AUTO = 0 |
1891086f6c7f
dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50097
diff
changeset
|
48 WRITE_MODE_FORCE_NEW = 1 |
50222
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
49 WRITE_MODE_FORCE_APPEND = 2 |
50221
1891086f6c7f
dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50097
diff
changeset
|
50 |
47482
cb29484eaade
dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47481
diff
changeset
|
51 |
50237
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
52 V2_MAX_READ_ATTEMPTS = 5 |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
53 |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
54 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
55 class _dirstatemapcommon: |
48119
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
56 """ |
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
57 Methods that are identical for both implementations of the dirstatemap |
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
58 class, with and without Rust extensions enabled. |
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
59 """ |
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
60 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
61 _use_dirstate_v2: bool |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
62 _nodeconstants: typelib.NodeConstants |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
63 _ui: "uimod.ui" |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
64 _root: bytes |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
65 _filename: bytes |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
66 _nodelen: int |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
67 _dirtyparents: bool |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
68 _docket: Optional["docketmod.DirstateDocket"] |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
69 _write_mode: int |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
70 _pendingmode: Optional[bool] |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
71 identity: Optional[typelib.CacheStat] |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
72 |
48122
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
73 # please pytype |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
74 |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
75 _map = None |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
76 copymap = None |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
77 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
78 def __init__( |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
79 self, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
80 ui: "uimod.ui", |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
81 opener, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
82 root: bytes, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
83 nodeconstants: typelib.NodeConstants, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
84 use_dirstate_v2: bool, |
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
85 ) -> None: |
48120
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
86 self._use_dirstate_v2 = use_dirstate_v2 |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
87 self._nodeconstants = nodeconstants |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
88 self._ui = ui |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
89 self._opener = opener |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
90 self._root = root |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
91 self._filename = b'dirstate' |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
92 self._nodelen = 20 # Also update Rust code when changing this! |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
93 self._parents = None |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
94 self._dirtyparents = False |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
95 self._docket = None |
50222
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
96 write_mode = ui.config(b"devel", b"dirstate.v2.data_update_mode") |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
97 if write_mode == b"auto": |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
98 self._write_mode = WRITE_MODE_AUTO |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
99 elif write_mode == b"force-append": |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
100 self._write_mode = WRITE_MODE_FORCE_APPEND |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
101 elif write_mode == b"force-new": |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
102 self._write_mode = WRITE_MODE_FORCE_NEW |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
103 else: |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
104 # unknown value, fallback to default |
ecd28d89c29e
dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50221
diff
changeset
|
105 self._write_mode = WRITE_MODE_AUTO |
48120
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
106 |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
107 # for consistent view between _pl() and _read() invocations |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
108 self._pendingmode = None |
fe6617715464
dirstatemap: use a common __init__ for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48119
diff
changeset
|
109 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
110 def _set_identity(self) -> None: |
50126
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
111 self.identity = self._get_current_identity() |
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
112 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
113 def _get_current_identity(self) -> Optional[typelib.CacheStat]: |
50126
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
114 try: |
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
115 return util.cachestat(self._opener.join(self._filename)) |
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
116 except FileNotFoundError: |
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
117 return None |
85746485a4dd
dirstate: factor the identity getting/setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50125
diff
changeset
|
118 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
119 def may_need_refresh(self) -> bool: |
50128
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
120 if 'identity' not in vars(self): |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
121 # no existing identity, we need a refresh |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
122 return True |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
123 if self.identity is None: |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
124 return True |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
125 if not self.identity.cacheable(): |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
126 # We cannot trust the entry |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
127 # XXX this is a problem on windows, NFS, or other inode less system |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
128 return True |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
129 current_identity = self._get_current_identity() |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
130 if current_identity is None: |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
131 return True |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
132 if not current_identity.cacheable(): |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
133 # We cannot trust the entry |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
134 # XXX this is a problem on windows, NFS, or other inode less system |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
135 return True |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50126
diff
changeset
|
136 return current_identity != self.identity |
50241
342c3c4640b7
dirstate: factor the identity setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50238
diff
changeset
|
137 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
138 def preload(self) -> None: |
48122
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
139 """Loads the underlying data, if it's not already loaded""" |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
140 self._map |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
141 |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
142 def get(self, key, default=None): |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
143 return self._map.get(key, default) |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
144 |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
145 def __len__(self): |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
146 return len(self._map) |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
147 |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
148 def __iter__(self): |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
149 return iter(self._map) |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
150 |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
151 def __contains__(self, key): |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
152 return key in self._map |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
153 |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
154 def __getitem__(self, item): |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
155 return self._map[item] |
bbd924a36a6e
dirstatemap: move a multiple simple functions in the common class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
156 |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
157 ### disk interaction |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
158 |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
159 def _opendirstatefile(self): |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
160 fp, mode = txnutil.trypending(self._root, self._opener, self._filename) |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
161 if self._pendingmode is not None and self._pendingmode != mode: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
162 fp.close() |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
163 raise error.Abort( |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
164 _(b'working directory state may be changed parallelly') |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
165 ) |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
166 self._pendingmode = mode |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
167 return fp |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
168 |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
169 def _readdirstatefile(self, size: int = -1) -> bytes: |
52049
af54626bf358
dirstate-map: add a missing debug wait point when accessing the v2 docket
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51859
diff
changeset
|
170 testing.wait_on_cfg(self._ui, b'dirstate.pre-read-file') |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
171 try: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
172 with self._opendirstatefile() as fp: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
173 return fp.read(size) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49120
diff
changeset
|
174 except FileNotFoundError: |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
175 # File doesn't exist, so the current state is empty |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
176 return b'' |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
177 |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
178 @property |
51712
f3b34386d3e0
typing: add type hints to `mercurial.dirstatemap`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
179 def docket(self) -> "docketmod.DirstateDocket": |
52049
af54626bf358
dirstate-map: add a missing debug wait point when accessing the v2 docket
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51859
diff
changeset
|
180 testing.wait_on_cfg(self._ui, b'dirstate.pre-read-file') |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
181 if not self._docket: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
182 if not self._use_dirstate_v2: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
183 raise error.ProgrammingError( |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
184 b'dirstate only has a docket in v2 format' |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
185 ) |
50242
379a78001d8e
dirstate: set identity whenever we read the dirstate's v2 docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50241
diff
changeset
|
186 self._set_identity() |
50720
bfbd84c57bda
dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50683
diff
changeset
|
187 data = self._readdirstatefile() |
bfbd84c57bda
dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50683
diff
changeset
|
188 if data == b'' or data.startswith(docketmod.V2_FORMAT_MARKER): |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
189 self._docket = docketmod.DirstateDocket.parse( |
50720
bfbd84c57bda
dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50683
diff
changeset
|
190 data, self._nodeconstants |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
191 ) |
50720
bfbd84c57bda
dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50683
diff
changeset
|
192 else: |
bfbd84c57bda
dirstate-v2: actually fix the dirstate-v2 upgrade race
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50683
diff
changeset
|
193 raise error.CorruptedDirstate(b"dirstate is not in v2 format") |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
194 return self._docket |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
195 |
50236
53f196622699
dirstate: abstract the reading of the data file in v2 in a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50234
diff
changeset
|
196 def _read_v2_data(self): |
50237
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
197 data = None |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
198 attempts = 0 |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
199 while attempts < V2_MAX_READ_ATTEMPTS: |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
200 attempts += 1 |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
201 try: |
50238
c9066fc609ef
dirstate: deal with read-race for python code using rust object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50237
diff
changeset
|
202 # TODO: use mmap when possible |
50237
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
203 data = self._opener.read(self.docket.data_filename()) |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
204 except FileNotFoundError: |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
205 # read race detected between docket and data file |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
206 # reload the docket and retry |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
207 self._docket = None |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
208 if data is None: |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
209 assert attempts >= V2_MAX_READ_ATTEMPTS |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
210 msg = b"dirstate read race happened %d times in a row" |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
211 msg %= attempts |
a3b1ab5f5dee
dirstate: deal with read-race for pure python code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50236
diff
changeset
|
212 raise error.Abort(msg) |
50236
53f196622699
dirstate: abstract the reading of the data file in v2 in a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50234
diff
changeset
|
213 return self._opener.read(self.docket.data_filename()) |
53f196622699
dirstate: abstract the reading of the data file in v2 in a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50234
diff
changeset
|
214 |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
215 def write_v2_no_append(self, tr, st, meta, packed): |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
216 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
217 old_docket = self.docket |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
218 except error.CorruptedDirstate: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
219 # This means we've identified a dirstate-v1 file on-disk when we |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
220 # were expecting a dirstate-v2 docket. We've managed to recover |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
221 # from that unexpected situation, and now we want to write back a |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
222 # dirstate-v2 file to make the on-disk situation right again. |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
223 # |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
224 # This shouldn't be triggered since `self.docket` is cached and |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
225 # we would have called parents() or read() first, but it's here |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
226 # just in case. |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
227 old_docket = None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
228 |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
229 new_docket = docketmod.DirstateDocket.with_new_uuid( |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
230 self.parents(), len(packed), meta |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
231 ) |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
232 if old_docket is not None and old_docket.uuid == new_docket.uuid: |
50097
ca9d65d69c27
dirstate-v2: complain early on docket name collision
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49619
diff
changeset
|
233 raise error.ProgrammingError(b'dirstate docket name collision') |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
234 data_filename = new_docket.data_filename() |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
235 self._opener.write(data_filename, packed) |
50081
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
236 # tell the transaction that we are adding a new file |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
237 if tr is not None: |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
238 tr.addbackup(data_filename, location=b'plain') |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
239 # Write the new docket after the new data file has been |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
240 # written. Because `st` was opened with `atomictemp=True`, |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
241 # the actual `.hg/dirstate` file is only affected on close. |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
242 st.write(new_docket.serialize()) |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
243 st.close() |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
244 # Remove the old data file after the new docket pointing to |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
245 # the new data file was written. |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
246 if old_docket is not None and old_docket.uuid: |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
247 data_filename = old_docket.data_filename() |
50081
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
248 if tr is not None: |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
249 tr.addbackup(data_filename, location=b'plain') |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
250 unlink = lambda _tr=None: self._opener.unlink(data_filename) |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
251 if tr: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
252 category = b"dirstate-v2-clean-" + old_docket.uuid |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
253 tr.addpostclose(category, unlink) |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
254 else: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
255 unlink() |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
256 self._docket = new_docket |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
257 |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
258 ### reading/setting parents |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
259 |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
260 def parents(self): |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
261 if not self._parents: |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
262 if self._use_dirstate_v2: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
263 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
264 self.docket |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
265 except error.CorruptedDirstate as e: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
266 # fall back to dirstate-v1 if we fail to read v2 |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
267 self._v1_parents(e) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
268 else: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
269 self._parents = self.docket.parents |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
270 else: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
271 self._v1_parents() |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
272 |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
273 return self._parents |
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
274 |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
275 def _v1_parents(self, from_v2_exception=None): |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
276 read_len = self._nodelen * 2 |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
277 st = self._readdirstatefile(read_len) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
278 l = len(st) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
279 if l == read_len: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
280 self._parents = ( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
281 st[: self._nodelen], |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
282 st[self._nodelen : 2 * self._nodelen], |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
283 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
284 elif l == 0: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
285 self._parents = ( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
286 self._nodeconstants.nullid, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
287 self._nodeconstants.nullid, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
288 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
289 else: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
290 hint = None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
291 if from_v2_exception is not None: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
292 hint = _(b"falling back to dirstate-v1 from v2 also failed") |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
293 raise error.Abort( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
294 _(b'working directory state appears damaged!'), hint |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
295 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
296 |
48119
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
297 |
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
298 class dirstatemap(_dirstatemapcommon): |
35078
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
299 """Map encapsulating the dirstate's contents. |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
300 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
301 The dirstate contains the following state: |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
302 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
303 - `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
|
304 detect when changes have occurred to the dirstate file. |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
305 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
306 - `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
|
307 parents are updated by calling `setparents`. |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
308 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
309 - 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
|
310 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
|
311 '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
|
312 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
|
313 documentation for details): |
aa442fde0ea5
dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
314 |
aa442fde0ea5
dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
315 - `reset_state`, |
aa442fde0ea5
dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
316 - `set_tracked` |
aa442fde0ea5
dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
317 - `set_untracked` |
aa442fde0ea5
dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
318 - `set_clean` |
aa442fde0ea5
dirstate: update the documentation of the dirstatemap API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47990
diff
changeset
|
319 - `set_possibly_dirty` |
35078
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
320 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
321 - `copymap` maps destination filenames to their source filename. |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
322 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
323 The dirstate also provides the following views onto the state: |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
324 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
325 - `filefoldmap` is a dict mapping normalized filenames to the denormalized |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
326 form that they appear as in the dirstate. |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
327 |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
328 - `dirfoldmap` is a dict mapping normalized directory names to the |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
329 denormalized form that they appear as in the dirstate. |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
330 """ |
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
331 |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
332 ### Core data storage and access |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
333 |
34934
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
334 @propertycache |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
335 def _map(self): |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
336 self._map = {} |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
337 self.read() |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
338 return self._map |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
339 |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
340 @propertycache |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
341 def copymap(self): |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
342 self.copymap = {} |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
343 self._map |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
344 return self.copymap |
6e66033f91cc
dirstate: avoid reading the map when possible (issue5713) (issue5717)
Durham Goode <durham@fb.com>
parents:
34933
diff
changeset
|
345 |
34933
0217f75b6e59
dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents:
34678
diff
changeset
|
346 def clear(self): |
34935
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
347 self._map.clear() |
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
348 self.copymap.clear() |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
349 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
|
350 util.clearcachedproperty(self, b"_dirs") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
351 util.clearcachedproperty(self, b"_alldirs") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
352 util.clearcachedproperty(self, b"filefoldmap") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
353 util.clearcachedproperty(self, b"dirfoldmap") |
34933
0217f75b6e59
dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents:
34678
diff
changeset
|
354 |
35878
6e7fae8f1c6c
contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents:
35835
diff
changeset
|
355 def items(self): |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
356 return self._map.items() |
34332
b36881c68569
dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents:
34188
diff
changeset
|
357 |
35878
6e7fae8f1c6c
contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents:
35835
diff
changeset
|
358 # forward for python2,3 compat |
6e7fae8f1c6c
contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents:
35835
diff
changeset
|
359 iteritems = items |
6e7fae8f1c6c
contrib: fix dirstatenonnormalcheck to work in Python 3
Augie Fackler <augie@google.com>
parents:
35835
diff
changeset
|
360 |
48023
357307feaf61
debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents:
48019
diff
changeset
|
361 def debug_iter(self, all): |
357307feaf61
debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents:
48019
diff
changeset
|
362 """ |
48024
cedfe2606adf
debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents:
48023
diff
changeset
|
363 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
|
364 |
48023
357307feaf61
debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents:
48019
diff
changeset
|
365 `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
|
366 """ |
51699
ca7bde5dbafb
black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51696
diff
changeset
|
367 for filename, item in self.items(): |
48024
cedfe2606adf
debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents:
48023
diff
changeset
|
368 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
|
369 |
34332
b36881c68569
dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents:
34188
diff
changeset
|
370 def keys(self): |
b36881c68569
dirstate: create new dirstatemap class
Durham Goode <durham@fb.com>
parents:
34188
diff
changeset
|
371 return self._map.keys() |
34333
4ac04418ce66
dirstate: move nonnormalentries to dirstatemap
Durham Goode <durham@fb.com>
parents:
34332
diff
changeset
|
372 |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
373 ### reading/setting parents |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
374 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
375 def setparents(self, p1, p2, fold_p2=False): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
376 self._parents = (p1, p2) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
377 self._dirtyparents = True |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
378 copies = {} |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
379 if fold_p2: |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
380 for f, s in self._map.items(): |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
381 # Discard "merged" markers when moving away from a merge state |
48148
e2753a7acfa7
dirstate-item: use the `p2_info` property to replace more verbose call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48140
diff
changeset
|
382 if s.p2_info: |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
383 source = self.copymap.pop(f, None) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
384 if source: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
385 copies[f] = source |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
386 s.drop_merge_data() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
387 return copies |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
388 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
389 ### disk interaction |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
390 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
391 def read(self): |
50228
fc8e37c380d3
dirstate: add a synchronisation point before doing a full dirstate read
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50222
diff
changeset
|
392 testing.wait_on_cfg(self._ui, b'dirstate.pre-read-file') |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
393 if self._use_dirstate_v2: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
394 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
395 self.docket |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
396 except error.CorruptedDirstate: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
397 # fall back to dirstate-v1 if we fail to read v2 |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
398 self._set_identity() |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
399 st = self._readdirstatefile() |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
400 else: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
401 if not self.docket.uuid: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
402 return |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
403 testing.wait_on_cfg(self._ui, b'dirstate.post-docket-read-file') |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
404 st = self._read_v2_data() |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
405 else: |
50242
379a78001d8e
dirstate: set identity whenever we read the dirstate's v2 docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50241
diff
changeset
|
406 self._set_identity() |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
407 st = self._readdirstatefile() |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
408 |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
409 if not st: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
410 return |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
411 |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
412 # TODO: adjust this estimate for dirstate-v2 |
50925
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50720
diff
changeset
|
413 if hasattr(parsers, 'dict_new_presized'): |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
414 # Make an estimate of the number of files in the dirstate based on |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
415 # its size. This trades wasting some memory for avoiding costly |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
416 # resizes. Each entry have a prefix of 17 bytes followed by one or |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
417 # two path names. Studies on various large-scale real-world repositories |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
418 # found 54 bytes a reasonable upper limit for the average path names. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
419 # Copy entries are ignored for the sake of this estimate. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
420 self._map = parsers.dict_new_presized(len(st) // 71) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
421 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
422 # Python's garbage collector triggers a GC each time a certain number |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
423 # of container objects (the number being defined by |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
424 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
425 # for each file in the dirstate. The C version then immediately marks |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
426 # them as not to be tracked by the collector. However, this has no |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
427 # effect on when GCs are triggered, only on what objects the GC looks |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
428 # into. This means that O(number of files) GCs are unavoidable. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
429 # Depending on when in the process's lifetime the dirstate is parsed, |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
430 # this can get very expensive. As a workaround, disable GC while |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
431 # parsing the dirstate. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
432 # |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
433 # (we cannot decorate the function directly since it is in a C module) |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
434 if self._use_dirstate_v2: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
435 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
436 self.docket |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
437 except error.CorruptedDirstate: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
438 # fall back to dirstate-v1 if we fail to parse v2 |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
439 parse_dirstate = util.nogc(parsers.parse_dirstate) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
440 p = parse_dirstate(self._map, self.copymap, st) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
441 else: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
442 p = self.docket.parents |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
443 meta = self.docket.tree_metadata |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
444 parse_dirstate = util.nogc(v2.parse_dirstate) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
445 parse_dirstate(self._map, self.copymap, st, meta) |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
446 else: |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
447 parse_dirstate = util.nogc(parsers.parse_dirstate) |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
448 p = parse_dirstate(self._map, self.copymap, st) |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
449 if not self._dirtyparents: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
450 self.setparents(*p) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
451 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
452 # Avoid excess attribute lookups by fast pathing certain checks |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
453 self.__contains__ = self._map.__contains__ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
454 self.__getitem__ = self._map.__getitem__ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
455 self.get = self._map.get |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
456 |
48393
1a8a70b4b0ad
dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48392
diff
changeset
|
457 def write(self, tr, st): |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
458 if self._use_dirstate_v2: |
48392
434de12918fd
dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48260
diff
changeset
|
459 packed, meta = v2.pack_dirstate(self._map, self.copymap) |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
460 self.write_v2_no_append(tr, st, meta, packed) |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
461 else: |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
462 packed = parsers.pack_dirstate( |
48392
434de12918fd
dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48260
diff
changeset
|
463 self._map, self.copymap, self.parents() |
48223
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
464 ) |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
465 st.write(packed) |
b4f83c9e7905
dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48221
diff
changeset
|
466 st.close() |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
467 self._dirtyparents = False |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
468 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
469 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
470 def identity(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
471 self._map |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
472 return self.identity |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
473 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
474 ### code related to maintaining and accessing "extra" property |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
475 # (e.g. "has_dir") |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
476 |
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
|
477 def _dirs_incr(self, filename, old_entry=None): |
49118
2c78dd3f11de
dirstatemap: move `_dirs_incr` and `_dirs_decr` methods out of the common
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49117
diff
changeset
|
478 """increment the dirstate counter if applicable""" |
47687
e59bd6723f2f
dirstate-map: factor out the change to _dirs and _alldirs on adding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47686
diff
changeset
|
479 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
|
480 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
|
481 ) 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
|
482 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
|
483 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
|
484 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
|
485 |
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
|
486 def _dirs_decr(self, filename, old_entry=None, remove_variant=False): |
49118
2c78dd3f11de
dirstatemap: move `_dirs_incr` and `_dirs_decr` methods out of the common
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49117
diff
changeset
|
487 """decrement the dirstate counter if applicable""" |
47688
b37ab6b5c438
dirstate-map: factor out the change to _dirs and _alldirs on dropping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47687
diff
changeset
|
488 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
|
489 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
|
490 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
|
491 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
|
492 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
|
493 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
|
494 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
|
495 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
|
496 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
|
497 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
|
498 |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
499 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
500 def filefoldmap(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
501 """Returns a dictionary mapping normalized case paths to their |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
502 non-normalized versions. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
503 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
504 try: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
505 makefilefoldmap = parsers.make_file_foldmap |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
506 except AttributeError: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
507 pass |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
508 else: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
509 return makefilefoldmap( |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
510 self._map, util.normcasespec, util.normcasefallback |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
511 ) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
512 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
513 f = {} |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
514 normcase = util.normcase |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
515 for name, s in self._map.items(): |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
516 if not s.removed: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
517 f[normcase(name)] = name |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
518 f[b'.'] = b'.' # prevents useless util.fspath() invocation |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
519 return f |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
520 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
521 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
522 def dirfoldmap(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
523 f = {} |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
524 normcase = util.normcase |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
525 for name in self._dirs: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
526 f[normcase(name)] = name |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
527 return f |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
528 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
529 def hastrackeddir(self, d): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
530 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
531 Returns True if the dirstate contains a tracked (not removed) file |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
532 in this directory. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
533 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
534 return d in self._dirs |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
535 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
536 def hasdir(self, d): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
537 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
538 Returns True if the dirstate contains a file (tracked or removed) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
539 in this directory. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
540 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
541 return d in self._alldirs |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
542 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
543 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
544 def _dirs(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
545 return pathutil.dirs(self._map, only_tracked=True) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
546 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
547 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
548 def _alldirs(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
549 return pathutil.dirs(self._map) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
550 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
551 ### code related to manipulation of entries and copy-sources |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
552 |
49102
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
553 def reset_state( |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
554 self, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
555 filename, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
556 wc_tracked=False, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
557 p1_tracked=False, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
558 p2_info=False, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
559 has_meaningful_mtime=True, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
560 parentfiledata=None, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
561 ): |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
562 """Set a entry to a given state, diregarding all previous state |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
563 |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
564 This is to be used by the part of the dirstate API dedicated to |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
565 adjusting the dirstate after a update/merge. |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
566 |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
567 note: calling this might result to no entry existing at all if the |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
568 dirstate map does not see any point at having one for this file |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
569 anymore. |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
570 """ |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
571 # copy information are now outdated |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
572 # (maybe new information should be in directly passed to this function) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
573 self.copymap.pop(filename, None) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
574 |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
575 if not (p1_tracked or p2_info or wc_tracked): |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
576 old_entry = self._map.get(filename) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
577 self._drop_entry(filename) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
578 self._dirs_decr(filename, old_entry=old_entry) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
579 return |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
580 |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
581 old_entry = self._map.get(filename) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
582 self._dirs_incr(filename, old_entry) |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
583 entry = DirstateItem( |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
584 wc_tracked=wc_tracked, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
585 p1_tracked=p1_tracked, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
586 p2_info=p2_info, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
587 has_meaningful_mtime=has_meaningful_mtime, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
588 parentfiledata=parentfiledata, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
589 ) |
49103
77dfde417e5e
dirstatemap: remove `_insert_entry`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49102
diff
changeset
|
590 self._map[filename] = entry |
49102
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
591 |
49098
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
592 def set_tracked(self, filename): |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
593 new = False |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
594 entry = self.get(filename) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
595 if entry is None: |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
596 self._dirs_incr(filename) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
597 entry = DirstateItem( |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
598 wc_tracked=True, |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
599 ) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
600 |
49103
77dfde417e5e
dirstatemap: remove `_insert_entry`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49102
diff
changeset
|
601 self._map[filename] = entry |
49098
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
602 new = True |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
603 elif not entry.tracked: |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
604 self._dirs_incr(filename, entry) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
605 entry.set_tracked() |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
606 self._refresh_entry(filename, entry) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
607 new = True |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
608 else: |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
609 # XXX This is probably overkill for more case, but we need this to |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
610 # fully replace the `normallookup` call with `set_tracked` one. |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
611 # Consider smoothing this in the future. |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
612 entry.set_possibly_dirty() |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
613 self._refresh_entry(filename, entry) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
614 return new |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
615 |
49109
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
616 def set_untracked(self, f): |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
617 """Mark a file as no longer tracked in the dirstate map""" |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
618 entry = self.get(f) |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
619 if entry is None: |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
620 return False |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
621 else: |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
622 self._dirs_decr(f, old_entry=entry, remove_variant=not entry.added) |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
623 if not entry.p2_info: |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
624 self.copymap.pop(f, None) |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
625 entry.set_untracked() |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
626 self._refresh_entry(f, entry) |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
627 return True |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
628 |
49105
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
629 def set_clean(self, filename, mode, size, mtime): |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
630 """mark a file as back to a clean state""" |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
631 entry = self[filename] |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
632 size = size & rangemask |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
633 entry.set_clean(mode, size, mtime) |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
634 self._refresh_entry(filename, entry) |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
635 self.copymap.pop(filename, None) |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
636 |
49107
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
637 def set_possibly_dirty(self, filename): |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
638 """record that the current state of the file on disk is unknown""" |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
639 entry = self[filename] |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
640 entry.set_possibly_dirty() |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
641 self._refresh_entry(filename, entry) |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
642 |
48126
a1a6569b9283
dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
643 def _refresh_entry(self, f, entry): |
49117
4c562108384f
dirstatemap: move `_refresh_entry` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49116
diff
changeset
|
644 """record updated state of an entry""" |
48126
a1a6569b9283
dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
645 if not entry.any_tracked: |
a1a6569b9283
dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
646 self._map.pop(f, None) |
a1a6569b9283
dirstatemap: add a common `_refresh_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48125
diff
changeset
|
647 |
48132
c057d7c97b72
dirstatemap: add a common `_drop_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48131
diff
changeset
|
648 def _drop_entry(self, f): |
49116
cebb263c865c
dirstatemap: move `_drop_entry` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49115
diff
changeset
|
649 """remove any entry for file f |
cebb263c865c
dirstatemap: move `_drop_entry` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49115
diff
changeset
|
650 |
cebb263c865c
dirstatemap: move `_drop_entry` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49115
diff
changeset
|
651 This should also drop associated copy information |
cebb263c865c
dirstatemap: move `_drop_entry` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49115
diff
changeset
|
652 |
51699
ca7bde5dbafb
black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51696
diff
changeset
|
653 The fact we actually need to drop it is the responsability of the caller |
ca7bde5dbafb
black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51696
diff
changeset
|
654 """ |
48132
c057d7c97b72
dirstatemap: add a common `_drop_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48131
diff
changeset
|
655 self._map.pop(f, None) |
48133
55293938b843
dirstatemap: use a common implement for reset_state
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48132
diff
changeset
|
656 self.copymap.pop(f, None) |
48132
c057d7c97b72
dirstatemap: add a common `_drop_entry` method for dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48131
diff
changeset
|
657 |
42755
749ef8c31187
rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42747
diff
changeset
|
658 |
749ef8c31187
rust-dirstate: call rust dirstatemap from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42747
diff
changeset
|
659 if rustmod is not None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
660 |
48119
aec5b0981c26
dirstatemap: introduce a common base for the dirstatemap class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48109
diff
changeset
|
661 class dirstatemap(_dirstatemapcommon): |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
662 ### Core data storage and access |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
663 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
664 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
665 def _map(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
666 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
667 Fills the Dirstatemap when called. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
668 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
669 # ignore HG_PENDING because identity is used only for writing |
50241
342c3c4640b7
dirstate: factor the identity setting code in the dirstate map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50238
diff
changeset
|
670 self._set_identity() |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
671 |
50228
fc8e37c380d3
dirstate: add a synchronisation point before doing a full dirstate read
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50222
diff
changeset
|
672 testing.wait_on_cfg(self._ui, b'dirstate.pre-read-file') |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
673 if self._use_dirstate_v2: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
674 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
675 self.docket |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
676 except error.CorruptedDirstate as e: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
677 # fall back to dirstate-v1 if we fail to read v2 |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
678 parents = self._v1_map(e) |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
679 else: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
680 parents = self.docket.parents |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
681 inode = ( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
682 self.identity.stat.st_ino |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
683 if self.identity is not None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
684 and self.identity.stat is not None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
685 else None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
686 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
687 testing.wait_on_cfg( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
688 self._ui, b'dirstate.post-docket-read-file' |
50243
6cce0afc1454
rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50242
diff
changeset
|
689 ) |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
690 if not self.docket.uuid: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
691 data = b'' |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
692 self._map = rustmod.DirstateMap.new_empty() |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
693 else: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
694 data = self._read_v2_data() |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
695 self._map = rustmod.DirstateMap.new_v2( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
696 data, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
697 self.docket.data_size, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
698 self.docket.tree_metadata, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
699 self.docket.uuid, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
700 inode, |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
701 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
702 parents = self.docket.parents |
48051
98c0408324e6
dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents:
48050
diff
changeset
|
703 else: |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
704 parents = self._v1_map() |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
705 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
706 if parents and not self._dirtyparents: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
707 self.setparents(*parents) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
708 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
709 self.__contains__ = self._map.__contains__ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
710 self.__getitem__ = self._map.__getitem__ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
711 self.get = self._map.get |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
712 return self._map |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
713 |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
714 def _v1_map(self, from_v2_exception=None): |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
715 self._set_identity() |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
716 inode = ( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
717 self.identity.stat.st_ino |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
718 if self.identity is not None and self.identity.stat is not None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
719 else None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
720 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
721 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
722 self._map, parents = rustmod.DirstateMap.new_v1( |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
723 self._readdirstatefile(), inode |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
724 ) |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
725 except OSError as e: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
726 if from_v2_exception is not None: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
727 raise e from from_v2_exception |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
728 raise |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
729 return parents |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
730 |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
731 @property |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
732 def copymap(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
733 return self._map.copymap() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
734 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
735 def debug_iter(self, all): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
736 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
737 Return an iterator of (filename, state, mode, size, mtime) tuples |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
738 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
739 `all`: also include with `state == b' '` dirstate tree nodes that |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
740 don't have an associated `DirstateItem`. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
741 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
742 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
743 return self._map.debug_iter(all) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
744 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
745 def clear(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
746 self._map.clear() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
747 self.setparents( |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
748 self._nodeconstants.nullid, self._nodeconstants.nullid |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
749 ) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
750 util.clearcachedproperty(self, b"_dirs") |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
751 util.clearcachedproperty(self, b"_alldirs") |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
752 util.clearcachedproperty(self, b"dirfoldmap") |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
753 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
754 def items(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
755 return self._map.items() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
756 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
757 # forward for python2,3 compat |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
758 iteritems = items |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
759 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
760 def keys(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
761 return iter(self._map) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
762 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
763 ### reading/setting parents |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
764 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
765 def setparents(self, p1, p2, fold_p2=False): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
766 self._parents = (p1, p2) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
767 self._dirtyparents = True |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
768 copies = {} |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
769 if fold_p2: |
49120
3df46f3a3d6c
rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49118
diff
changeset
|
770 copies = self._map.setparents_fixup() |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
771 return copies |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
772 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
773 ### disk interaction |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
774 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
775 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
776 def identity(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
777 self._map |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
778 return self.identity |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
779 |
48393
1a8a70b4b0ad
dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48392
diff
changeset
|
780 def write(self, tr, st): |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
781 if not self._use_dirstate_v2: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
782 p1, p2 = self.parents() |
48392
434de12918fd
dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48260
diff
changeset
|
783 packed = self._map.write_v1(p1, p2) |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
784 st.write(packed) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
785 st.close() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
786 self._dirtyparents = False |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
787 return |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
788 |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
789 write_mode = self._write_mode |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
790 try: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
791 docket = self.docket |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
792 except error.CorruptedDirstate: |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
793 # fall back to dirstate-v1 if we fail to parse v2 |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
794 docket = None |
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
795 |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
796 # We can only append to an existing data file if there is one |
50657
bf16ef96defe
rust-dirstate: fall back to v1 if reading v2 failed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50252
diff
changeset
|
797 if docket is None or docket.uuid is None: |
50221
1891086f6c7f
dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50097
diff
changeset
|
798 write_mode = WRITE_MODE_FORCE_NEW |
1891086f6c7f
dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50097
diff
changeset
|
799 packed, meta, append = self._map.write_v2(write_mode) |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
800 if append: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
801 docket = self.docket |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
802 data_filename = docket.data_filename() |
50081
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
803 # We mark it for backup to make sure a future `hg rollback` (or |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
804 # `hg recover`?) call find the data it needs to restore a |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
805 # working repository. |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
806 # |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
807 # The backup can use a hardlink because the format is resistant |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
808 # to trailing "dead" data. |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
809 if tr is not None: |
9a0778bbae6a
dirstate: explicitly backup the datafile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49619
diff
changeset
|
810 tr.addbackup(data_filename, location=b'plain') |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
811 with self._opener(data_filename, b'r+b') as fp: |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
812 fp.seek(docket.data_size) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
813 assert fp.tell() == docket.data_size |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
814 written = fp.write(packed) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
815 if written is not None: # py2 may return None |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
816 assert written == len(packed), (written, len(packed)) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
817 docket.data_size += len(packed) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
818 docket.parents = self.parents() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
819 docket.tree_metadata = meta |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
820 st.write(docket.serialize()) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
821 st.close() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
822 else: |
48220
e7b5e8ba7cab
dirstate: Move more methods to the _dirstatemapcommon base class
Simon Sapin <simon.sapin@octobus.net>
parents:
48151
diff
changeset
|
823 self.write_v2_no_append(tr, st, meta, packed) |
48123
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
824 # Reload from the newly-written file |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
825 util.clearcachedproperty(self, b"_map") |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
826 self._dirtyparents = False |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
827 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
828 ### code related to maintaining and accessing "extra" property |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
829 # (e.g. "has_dir") |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
830 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
831 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
832 def filefoldmap(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
833 """Returns a dictionary mapping normalized case paths to their |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
834 non-normalized versions. |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
835 """ |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
836 return self._map.filefoldmapasdict() |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
837 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
838 def hastrackeddir(self, d): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
839 return self._map.hastrackeddir(d) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
840 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
841 def hasdir(self, d): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
842 return self._map.hasdir(d) |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
843 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
844 @propertycache |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
845 def dirfoldmap(self): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
846 f = {} |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
847 normcase = util.normcase |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
848 for name in self._map.tracked_dirs(): |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
849 f[normcase(name)] = name |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
850 return f |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
851 |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
852 ### code related to manipulation of entries and copy-sources |
771c90807a2b
dirstatemap: arrange methods by category
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48122
diff
changeset
|
853 |
49098
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
854 def set_tracked(self, f): |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
855 return self._map.set_tracked(f) |
55c158a33fa5
dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49040
diff
changeset
|
856 |
49109
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
857 def set_untracked(self, f): |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
858 return self._map.set_untracked(f) |
953b08a2d983
dirstatemap: move `set_untracked` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49107
diff
changeset
|
859 |
49105
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
860 def set_clean(self, filename, mode, size, mtime): |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
861 self._map.set_clean(filename, mode, size, mtime) |
a69ea5a3c5a5
dirstatemap: move `set_clean` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49103
diff
changeset
|
862 |
49107
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
863 def set_possibly_dirty(self, f): |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
864 self._map.set_possibly_dirty(f) |
079aaf996eca
dirstatemap: move `set_possibly_dirty` out of the common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49105
diff
changeset
|
865 |
49102
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
866 def reset_state( |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
867 self, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
868 filename, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
869 wc_tracked=False, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
870 p1_tracked=False, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
871 p2_info=False, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
872 has_meaningful_mtime=True, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
873 parentfiledata=None, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
874 ): |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
875 return self._map.reset_state( |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
876 filename, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
877 wc_tracked, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
878 p1_tracked, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
879 p2_info, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
880 has_meaningful_mtime, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
881 parentfiledata, |
358b1a1e3678
dirstatemap: move `reset_state` out of common methods
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49099
diff
changeset
|
882 ) |